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的特点还是有办法解决这个问题?
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)
这是方法的特殊性static。在 Java 中,无论是泛型还是其他方式,都无法定义适用于static方法的接口,即。一个类应该/必须实现一个static方法。
此外,类型擦除(除其他外)可以防止您在方法调用表达式中使用类型变量T作为类型名称static。