Java 从泛型类中访问T类型的静态方法
我不熟悉泛型,正在努力适应我的情况: 我目前有几个SyncData类,每个类对应于我希望同步的对象类型。我正在考虑将其更改为单个通用类SyncData。在这个类中,代码的某些部分将使用类型为T的对象,但我也希望引用类型为T的静态方法。例如,这将使我能够指定在同步完成时调用的通知操作(特定于数据类型) 我陷入了一个循环:为了访问方法,我需要在泛型T扩展接口中定义一个所有类型都将实现的接口,然后我可以在泛型SyncData类中引用T类型的相关方法。但是,我不能在接口中指定静态方法,因为我不能在接口中指定静态方法,所以我不能在我的通用SyncData类中访问它 我已经看过了各种教程,这里的问题等等,也许我错过了显而易见的,但我看不到前进的方向-所有涉及泛型和静态网络方法的不同问题的东西。如有任何建议,将不胜感激 编辑: 根据要求,添加了一些示例代码来说明我试图做的事情(我实际上希望在代码中的其他各个点使用静态方法,但这说明了这一点) 是否可以从SyncAction类中访问类T的静态方法(不使T扩展DataType1,因为T不能是DataType2,所以使用泛型没有意义)Java 从泛型类中访问T类型的静态方法,java,generics,static-methods,Java,Generics,Static Methods,我不熟悉泛型,正在努力适应我的情况: 我目前有几个SyncData类,每个类对应于我希望同步的对象类型。我正在考虑将其更改为单个通用类SyncData。在这个类中,代码的某些部分将使用类型为T的对象,但我也希望引用类型为T的静态方法。例如,这将使我能够指定在同步完成时调用的通知操作(特定于数据类型) 我陷入了一个循环:为了访问方法,我需要在泛型T扩展接口中定义一个所有类型都将实现的接口,然后我可以在泛型SyncData类中引用T类型的相关方法。但是,我不能在接口中指定静态方法,因为我不能在接口中
公共接口可同步{
//需要以下操作,否则我无法在SyncAction中访问onSyncComplete
onSyncComplete()上的公共无效;
}
公共类DataType1实现了Syncable{
//因与问题无关而删除构造函数等
//Eclipse警告“此静态方法无法从Syncable隐藏实例方法”
公共静态void onSyncComplete(){
//你在这儿干什么
}
}
公共集体诉讼{
//使用多个DataType1对象执行所有同步等操作
T.onSyncComplete();
}
即使onSyncComplete()
方法可以是静态的,但您必须使它们成为实例(即非静态)方法才能工作
原因是静态方法(和字段)不是“继承的”
如果您确实想要一个静态方法,可以让您的onSyncComplete()
实例方法在其实现中调用另一个(可能是私有的)静态方法。几件事:
Eclipse正确地指出您的onSyncComplete()
的static
版本不正确。发件人:
如果静态方法隐藏实例方法,则是编译时错误
在这种情况下,您的static
方法隐藏了在接口中定义的实例方法,因此您会得到一个错误
这是因为,如果允许这样的事情发生,那么是否调用静态方法或实例方法就会有一些模糊性,因为您可以在实例上调用静态方法(尽管这对于可读性来说不是一个好主意,而且有些人会这样做)
不能对泛型类型调用静态方法的原因是静态方法在编译时绑定。由于泛型类型在编译到其边界类型时被擦除(在您的例子中为
Syncable
),编译器将无法确定要绑定的静态方法,因此会发出错误。问题是什么?你应该包括一个明确的问题,而不是陈述。这样就更容易理解和更清晰了。请分享一个示例代码以使其更清晰。抱歉,我正在寻找如何解决此问题的建议:是否可以以我想要的方式访问静态Methodo?我将获得一些简化的代码来添加为什么它们需要是静态的?两个原因-a)它允许我在不创建实例的情况下访问它们b) 由于它们不与实例变量交互,因此它们可以是静态的。我希望创建的其他静态方法包括返回未同步对象数组的方法。
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();
}