我正在尝试编写一个泛型方法,用于从包含位掩码的整数初始化EnumSet值。我收到编译错误,我不明白。这是我的代码:
private <E extends Enum<E>> void setEnumSet( EnumSet<E> es, int iEnum ) {
es.clear();
for (E e : E.values()) {
if (0 != (iEnum & (1<<e.ordinal()))) {
es.add(e);
}
}
}
编译错误:
1>Javac...
1>.\wdqapi.java:266: error: cannot find symbol
1> for (E e : E.values()) {
1> ^
1> symbol: method values()
1> location: class Enum<E>
1> where E is a type-variable:
1> E extends Enum<E> declared in method <E>_setEnumSet(EnumSet<E>,int)
是否有一些特殊的语法来访问E的values()方法? (我是一个Java noob。)有人可以帮我解决这个编译错误吗?感谢。
答案 0 :(得分:4)
您无法直接对泛型类型执行操作,因为在运行时类型擦除会将所有这些替换为Object
。因此,上面的代码将执行Object.values()
,这显然不起作用。
执行此操作的方法是使用Class.getEnumConstants()
要执行此操作,您需要E
Class
E
对象private <E extends Enum<E>> void setEnumSet(E[] values,
EnumSet<E> es, int iEnum )
的实例。同样,请记住,在运行时,type-erasure将删除对泛型类型的所有引用。
尝试类似:
private <E extends Enum<E>> void setEnumSet(Class<E> type,
EnumSet<E> es, int iEnum )
或
{{1}}
答案 1 :(得分:0)
作为传递values数组的替代方法,您可以从Class<E>
恢复EnumSet
。如果该集合不为空,请使用set.iterator().next().getDeclaringClass()
;如果集合为空,则使用EnumSet.complementOf(set)
获取非空集,然后获取元素并像以前一样获取其类。 (奇怪的是,EnumSet没有提供直接获取枚举类的方法,尽管必须将它存储为complementOf
才能工作。)
获得Class对象后,请使用John B&#39>中提到的Class.getEnumConstants
。