我正在尝试创建一个enum
类的集合,以便我可以遍历集合,然后通过调用enumClass.getEnumConstants()
来遍历枚举值。
鉴于以下内容:
public interface MyEnumType {
String getSubtype ();
}
public enum MyEnumTypeA implements MyEnumType {
A_1,
A_2;
public String getSubtype () { return "A"; }
}
public enum MyEnumTypeB implements MyEnumType {
B_1,
B_2;
public String getSubtype () { return "B"; }
}
我尝试过使用varargs:
private <T extends Enum<T> & MyEnumType> void handleTypes (
Class<? extends T>... enumTypes )
{
for( Class<? extends T> enumType : enumTypes )
for( T value : enumType.getEnumConstants() )
handleValue( value );
}
private void doStuff () {
// error here
handleTypes( MyEnumTypeA.class, MyEnumTypeB.class );
}
...但是当我尝试调用函数时,在varargs中使用通配符泛型会产生编译错误
我也尝试构建List
:
public class MyMainClass
{
private static Collection<Class<Enum<? extends MyEnumType>>> ALL_TYPES
= Lists.newArrayList();
{
// error here
ALL_TYPES.add( MyEnumTypeA.class );
ALL_TYPES.add( MyEnumTypeB.class );
}
}
...但是当我尝试add
到列表时,这也无法编译。
以下工作但需要强制转换(如果我传入Object.class
,则没有编译错误或警告):
private void runNoMatchTests ( Class... enumTypes ) {
for( Class enumType : enumTypes ) {
for( MyEnumType value : ( (Class<MyEnumType>)enumType ).getEnumConstants() ) {
handleValue( value );
}
}
}
如何在不使用演员表的情况下完成此操作?可以不使用演员表来完成吗?
答案 0 :(得分:1)
我不完全确定为什么会出现这种情况,但如果您将<T extends Enum<T> & MyEnumType>
更改为<T extends Enum<?> & MyEnumType>
,则可以编译您的第一次尝试,如下所示:
private <T extends Enum<?> & MyEnumType> void handleTypes(Class<? extends T>... enumTypes) {
...
}