我想写一个泛型方法,它采用扩展Enum的有界参数。例如,如果我有一个枚举如下:
public enum InputFlags{
ONE (0000001),
TWO (0000002),
THREE (00000004);
public final int value;
InputFlags(int value){
this.value = value;
}
}
然后我可以执行以下操作:
for (InputFlags ifg : InputFlags.values()){
// Do something with ifg
}
但是,如果我尝试在返回参数有限的泛型方法中执行上述操作,则无法访问values()
方法:
public static <T extends Enum> T getFlags(int f){
T.values(); // NOT allowed, even though I have bounded by extending Enum.
}
好像我无法在泛型方法中访问values()
。这是Enums的特点还是有办法解决这个问题?
答案 0 :(得分:8)
values()
在Java中是一件非常奇怪的事情。查看Enum
的文档 - values()
甚至不存在! values()
根本不是Enum
的方法。相反,名为static
的{{1}}方法会隐式添加到扩展values()
的每个类中。但是,一个Enum
的{{1}}方法与另一个values()
中的enum
方法不同。
事实values()
表示如果enum
的类型为T extends Enum
,您可以在t
T
上调用实例方法。你无法调用Enum
的{{1}}方法(即使你可以,t
也不存在!)
static
仅在您知道名称的实际Enum
时才有用。只有类型参数values()
时才能使用它。
解决此问题的方法是传递values()
对象。像这样:
enum
答案 1 :(得分:1)
values()
是编译器在InputFlags
类中插入的静态方法。因此,不可能使用T.values()
,尤其是因为T是泛型类型。但是,如果您可以获取T的Class
对象(通常是通过getClass()
,或者将其传递给getFlags(int f, Class<T> clazz)
),则可以在该对象上使用Class#getEnumConstants()
。
答案 2 :(得分:0)
这是static
方法的特性。在Java中,无论使用泛型还是其他方法,都无法定义适用于static
方法的接口,即。一个类应该/必须实现static
方法。
此外,类型擦除(除其他外)阻止您在T
方法调用表达式中使用类型变量static
作为类型名称。