- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我试图了解如何在 Java 中正确地“扩展”第 3 方库(包括类和接口(interface))以及如何简单地将它们用作直接替代品。
我目前正在使用 Twitter4J
图书馆。现在我必须手动将 @
添加到 User
的 getScreenName()
方法的结果中每次我调用它时:
twitter4j.User user = getTwitterUser();
String userHandle = "@" + user.getScreenName();
我目前已经尝试了一些方法,但没有任何效果。这是我想出的:
package my.app;
public abstract class User implements twitter4j.User {
public String getHandle() {
return "@" + getScreenName();
}
}
这样调用:
User user = (User) getTwitterUser();
String userHandle = user.getHandle();
这会崩溃并显示消息:
java.lang.ClassCastException: twitter4j.UserJSONImpl cannot be cast to my.app.User
最佳答案
我们打个汽车比喻。你的地方旁边有一个卖车的车库。所以你可以从车库里得到一辆车:
Car car = garage.buyCar(money);
车库恰好出售的汽车是沃尔沃。所以,你得到一辆车,而这辆车(Car 是一个接口(interface))实际上是一辆沃尔沃。如果你知道这辆车是沃尔沃,你可以这样做:
Volvo car = (Volvo) garage.buyCar(money);
这根本不会改变车库销售汽车的方式,或者车库销售的汽车类型。只是因为您知道它们是沃尔沃,所以您可以转换结果以访问沃尔沃汽车的特性。
请注意,这现在有效。但没有什么能阻止车库后来决定出售大众汽车而不是沃尔沃汽车。如果他们这样做,类型转换将不再有效,这将是你的错:车库告诉你它卖汽车,但没有 promise 它会是沃尔沃。
现在,您希望车库改为生产保时捷。努力去做
Porsche car = (Porsche) garage.buyCar(money);
不会工作。仅仅因为您非常希望这辆车成为保时捷,不会神奇地将车库生产的沃尔沃改成保时捷。
您所能做的就是获取 User
并调用一个实用程序方法来创建该用户的句柄。或者创建您自己的 UserWithHandle
类来实现 User
,添加 getHandle()
方法,并通过委托(delegate)给原始方法来实现所有其他方法, 包装用户:
UserWithHandle u = new UserWithHandle(getTwitterUser())
如果库允许您提供 UserFactory
实现,您可以做您想做的事,这将取代它以您自己的方式创建用户的方式。有点像车库允许您提供自己的油漆工。
做你想做的事,即向现有类添加方法在 Java 中是不可能的,但在某些语言中是可能的,例如 Kotlin(它与 Java 兼容并在 JVM 上运行,如果你感兴趣的话),其中它们被称为扩展方法。基本上,这些方法是静态实用方法,例如,将 User
作为参数并返回其句柄,但可以像调用 User
的实例方法一样调用.
关于java - 通过向它添加方法来扩展 Java 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36952056/
我创建了一个用户可以添加测试的字段。这一切运行顺利我只希望当用户点击(添加另一个测试)然后上一个(添加另一个测试)删除并且这个显示在新字段中。 所有运行良好的唯一问题是点击(添加另一个字段)之前添加另
String[] option = {"Adlawan", "Angeles", "Arreza", "Benenoso", "Bermas", "Brebant
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在努力将 jQuery 滚动功能添加到 nav-tab (Bootstrap 3)。我希望用户能够选择他们想要的选项卡,并在选项卡内容中有一个可以平滑滚动到 anchor 的链接。这是我的代码,可
我正在尝试在用户登录后再添加 2 个 ui 选项卡。首先,我尝试做一个之后。 $('#slideshow').tabs('remove', '4'); $("#slideshow ul li:last
我有一个包含选择元素的表单,我想通过选择添加和删除其中一些元素。这是html代码(这里也有jsfiddle http://jsfiddle.net/txhajy2w/):
正在写这个: view.backgroundColor = UIColor.white.withAlphaComponent(0.9) 等同于: view.backgroundColor = UICo
好的,如果其中有任何信息,我想将这些列添加到一起。所以说我有 账户 1 2 3 . 有 4 个帐户空间,但只有 3 个帐户。我如何创建 java 脚本来添加它。 最佳答案 Live Example H
我想知道是否有一种有效的预制算法来确定一组数字的和/差是否可以等于不同的数字。示例: 5、8、10、2,使用 + 或 - 等于 9。5 - 8 = -3 + 10 = 7 + 2 = 9 如果有一个预
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我的 Oracle SQL 查询如下- Q1- select hca.account_number, hca.attribute3, SUM(rcl.extended_amou
我正在阅读 http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingG
我正在尝试添加一个“加载更多”按钮并限制下面的结果,这样投资组合页面中就不会同时加载 1000 个内容,如下所示:http://typesetdesign.com/portfolio/ 我对 PHP
我遇到这个问题,我添加了 8 个文本框,它工作正常,但是当我添加更多文本框(如 16 个文本框)时,它不会添加最后一个文本框。有人遇到过这个问题吗?提前致谢。 Live Link: JAVASCRIP
add/remove clone first row default not delete 添加/删除克隆第一行默认不删除&并获取正确的SrNo(例如:添加3行并在看到问题后删除SrNo.2)
我编码this ,但删除按钮不起作用。我在控制台中没有任何错误.. var counter = 0; var dataList = document.getElementById('materi
我有一个类似数组的对象: [1:数组[10]、2:数组[2]、3:数组[2]、4:数组[2]、5:数组[3]、6:数组[1]] 我正在尝试删除前两个元素,执行一些操作,然后将它们再次插入到同一位置。
使用的 Delphi 版本:2007 你好, 我有一个 Tecord 数组 TInfo = Record Name : String; Price : Integer; end; var Info
我使用了基本的 gridster 代码,然后我声明了通过按钮添加和删除小部件的函数它工作正常但是当我将调整大小功能添加到上面的代码中时,它都不起作用(我的意思是调整大小,添加和删除小部件) 我的js代
title 323 323 323 title 323 323 323 title 323 323 323 JS $(document).keydown(function(e){
我是一名优秀的程序员,十分优秀!