我是仿制药的新手,我正在努力应用我的情况:
我目前有几个SyncData类,每个类对应我希望同步的对象类型。我正在考虑将其更改为单个通用类SyncData。在这个类中,代码的某些部分将使用类型为T的对象,但我也想引用类型为T的静态方法。这将使我能够例如指定要调用的通知操作(特定于数据类型)完成同步后。
我自己陷入了一个循环:访问我需要定义所有类型将实现的接口的方法,在通用T扩展接口中,然后我可以在我的内部引用类型T的相关方法通用SyncData类。但是我不能在接口中指定静态方法,因为我不能在接口中,我无法在我的通用SyncData类中访问它。
我已经查看了各种教程,问题等等,也许我错过了显而易见的事情,但我看不到前进的方向 - 所有出现的问题都可以引用泛型和静态方法的不同问题。任何建议都将非常感谢。
修改
根据要求添加了一些示例代码来说明我尝试做的事情(我实际上是想在代码中的其他各个点使用静态方法,但这说明了这一点。)
是否可以从SyncAction类中访问类T的静态方法(不使T扩展DataType1,因此使用泛型没有任何意义,因为T不能是DataType2)?
public interface Syncable {
//following needed or I can't access onSyncComplete in SyncAction
public void onSyncComplete();
}
public class DataType1 implements Syncable {
//constructor etc removed as irrelevant to question
//Eclipse warns 'this static method cannot hide instance method from Syncable'
public static void onSyncComplete(){
//do stiff here
}
}
public class SyncAction<T extends Syncable>{
//do all the syncing etc using multiple DataType1 objects
T.onSyncComplete();
}
答案 0 :(得分:1)
即使onSyncComplete()
方法 可以是静态的,你也必须使它们成为实例(即非静态)方法。
原因是静态方法(和字段)不是&#34;继承&#34;。
如果你真的想要一个静态方法,你可以让你的onSyncComplete()
实例方法在其实现中调用另一个(也许是私有的)静态方法。
答案 1 :(得分:1)
少数事情:
Eclipse说明static
onSyncComplete()
版本static
不正确是正确的。来自JLS seciton 8.4.8.2:
如果静态方法隐藏了实例方法,则为编译时错误。
在这种情况下,您的Syncable
方法隐藏了界面中定义的实例方法,因此您收到错误。
这是因为如果允许这样的事情,那么是否要调用静态方法或实例方法会有一些歧义,因为你可以在一个实例上调用静态方法(虽然这不是真的一个可读性的好主意,有些人considered a mistake。
无法在泛型类型上调用静态方法的原因是静态方法在编译时被绑定。因为泛型类型在编译期间被擦除到它们的边界类型(在你的情况下为{{1}}),编译器将无法找出要绑定的静态方法,因此会发出错误。