具有有界扩展枚举参数的通用方法 - 无法访问values()方法

Ker*_*rry 5 java generics enums

我想写一个泛型方法,它采用扩展Enum的有界参数.例如,如果我有一个枚举如下:

public enum InputFlags{
    ONE (0000001),
    TWO (0000002),
    THREE (00000004);

    public final int value;

    InputFlags(int value){
        this.value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我可以做以下事情:

for (InputFlags ifg : InputFlags.values()){
            // Do something with ifg
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试在返回参数有界的泛型方法中执行上述操作,则无法访问该values()方法:

public static <T extends Enum> T getFlags(int f){
        T.values(); // NOT allowed, even though I have bounded by extending Enum.
}
Run Code Online (Sandbox Code Playgroud)

好像我无法访问values()泛型方法.这是Enums的特点还是有办法解决这个问题?

Pau*_*ton 8

values()在Java中是一件非常奇怪的事情.在文档中查找Enum- values()甚至不存在!values()根本不是一种方法Enum.而是将一个static被调用的方法values()隐式添加到每个扩展的类中Enum.但是values()一种方法与另一种方法enum不同.values()enum

T extends Enum意味着如果t有类型,T你可以从上面调用实例方法.你无法调用方法(即使你可以,也不会存在!)EnumtstaticEnumvalues()

values()仅在您知道实际enum名称时才有用.只有类型参数时才能使用它T.

解决这个问题的方法是传递一个Class对象.像这样:

public static <T extends Enum<T>> T getFlags(Class<T> clazz, int f){
    T[] array = clazz.getEnumConstants();  // This is how you can get an array.
    Set<T> set = EnumSet.allOf(clazz);     // This is how you can get a Set.     
}
Run Code Online (Sandbox Code Playgroud)


Sot*_*lis 0

这是方法的特殊性static。在 Java 中,无论是泛型还是其他方式,都无法定义适用于static方法的接口,即。一个类应该/必须实现一个static方法。

此外,类型擦除(除其他外)可以防止您在方法调用表达式中使用类型变量T作为类型名称static