Java 从泛型类中访问T类型的静态方法

Java 从泛型类中访问T类型的静态方法,java,generics,static-methods,Java,Generics,Static Methods,我不熟悉泛型,正在努力适应我的情况: 我目前有几个SyncData类,每个类对应于我希望同步的对象类型。我正在考虑将其更改为单个通用类SyncData。在这个类中,代码的某些部分将使用类型为T的对象,但我也希望引用类型为T的静态方法。例如,这将使我能够指定在同步完成时调用的通知操作(特定于数据类型) 我陷入了一个循环:为了访问方法,我需要在泛型T扩展接口中定义一个所有类型都将实现的接口,然后我可以在泛型SyncData类中引用T类型的相关方法。但是,我不能在接口中指定静态方法,因为我不能在接口中

我不熟悉泛型,正在努力适应我的情况:

我目前有几个SyncData类,每个类对应于我希望同步的对象类型。我正在考虑将其更改为单个通用类SyncData。在这个类中,代码的某些部分将使用类型为T的对象,但我也希望引用类型为T的静态方法。例如,这将使我能够指定在同步完成时调用的通知操作(特定于数据类型)

我陷入了一个循环:为了访问方法,我需要在泛型T扩展接口中定义一个所有类型都将实现的接口,然后我可以在泛型SyncData类中引用T类型的相关方法。但是,我不能在接口中指定静态方法,因为我不能在接口中指定静态方法,所以我不能在我的通用SyncData类中访问它

我已经看过了各种教程,这里的问题等等,也许我错过了显而易见的,但我看不到前进的方向-所有涉及泛型和静态网络方法的不同问题的东西。如有任何建议,将不胜感激

编辑:

根据要求,添加了一些示例代码来说明我试图做的事情(我实际上希望在代码中的其他各个点使用静态方法,但这说明了这一点)

是否可以从SyncAction类中访问类T的静态方法(不使T扩展DataType1,因为T不能是DataType2,所以使用泛型没有意义)

公共接口可同步{
//需要以下操作,否则我无法在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();
}