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

时间:2014-05-17 21:31:29

标签: java generics static-methods

我是仿制药的新手,我正在努力应用我的情况:

我目前有几个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();
}

2 个答案:

答案 0 :(得分:1)

即使onSyncComplete()方法 可以是静态的,你也必须使它们成为实例(即非静态)方法。

原因是静态方法(和字段)不是&#34;继承&#34;。

如果你真的想要一个静态方法,你可以让你的onSyncComplete()实例方法在其实现中调用另一个(也许是私有的)静态方法。

答案 1 :(得分:1)

少数事情:

Eclipse说明static onSyncComplete()版本static不正确是正确的。来自JLS seciton 8.4.8.2

  

如果静态方法隐藏了实例方法,则为编译时错误。

在这种情况下,您的Syncable方法隐藏了界面中定义的实例方法,因此您收到错误。

这是因为如果允许这样的事情,那么是否要调用静态方法或实例方法会有一些歧义,因为你可以在一个实例上调用静态方法(虽然这不是真的一个可读性的好主意,有些人considered a mistake


无法在泛型类型上调用静态方法的原因是静态方法在编译时被绑定。因为泛型类型在编译期间被擦除到它们的边界类型(在你的情况下为{{1}}),编译器将无法找出要绑定的静态方法,因此会发出错误。