我想编写一个通用方法,它采用扩展 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()
method:
public static <T extends Enum> T getFlags(int f){
T.values(); // NOT allowed, even though I have bounded by extending Enum.
}
好像我无法访问values()
在通用方法中。这是枚举的特性还是有解决方法?
values()
在Java中是一件很奇怪的事情。在文档中查找Enum
- values()
根本不存在!values()
不是一种方法Enum
根本不。相反,static
方法称为values()
隐式添加到每个扩展类中Enum
。但是values()
方法一enum
不同于values()
另一个方法enum
.
事实是T extends Enum
意味着如果t
有类型T
你可以打电话instance方法来自Enum
on 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.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)