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
你可以从上面调用实例方法.你无法调用方法(即使你可以,也不会存在!)Enum
t
static
Enum
values()
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
。