如何在java泛型中为type参数定义静态字段

Fra*_*ank 10 java oop generics static interface

我想定义一个这样的时间界面:

public interface TimeInterface<T>
{
    static T ZERO;
    static T INFINITY;
    // some other methods...
}
Run Code Online (Sandbox Code Playgroud)

这可能,或如何做到这一点,以避免错误?

提前致谢!

Raz*_*zib 18

javadoc直接:

我们不能声明其类型为类型参数的静态字段

类的静态字段是类的所有非静态对象共享的类级变量.因此,不允许使用类型参数的静态字段.考虑以下课程:

public class MobileDevice<T> {
    private static T os;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果允许类型参数的静态字段,则以下代码将混淆:

MobileDevice<Smartphone> phone = new MobileDevice<>();
MobileDevice<Pager> pager = new MobileDevice<>();
MobileDevice<TabletPC> pc = new MobileDevice<>();
Run Code Online (Sandbox Code Playgroud)

因为静态字段os由电话,寻呼机和PC共享,所以os的实际类型是什么?它不能是智能手机,寻呼机,TabletPC同时也是.因此,您无法创建类型参数的静态字段.


Kon*_*kov 5

唯一可以包含类型参数的是方法 ,它必须定义自己的类型参数。就像是:staticstatic

static <T> void staticGenericMethod(T param) { .. }
Run Code Online (Sandbox Code Playgroud)

static在您的情况下,类型参数具有类范围,它是实例绑定的并且与类的成员无关。

因此,您应该删除and的static关键字,或者引入返回and 的方法。例如:ZEROINFINITY staticZEROINFINITY

public interface TimeInterface<T> {
    static <X> X getZero() { 
         //implementation
    }
    static <X> X getInfinity() {

    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,X类型参数仅对相应的静态方法有效,并且不在类中共享。

然而,这种方法的问题在于,无法确保实例类型参数 ( T) 与静态方法的类型参数 ( ) 相同X,如果使用不正确,可能会导致严重问题。

另请注意,staticJava8 中的接口中允许使用方法,因此如果您使用的是 Java 版本,则应将其转换TimeInterface为类。