我正在尝试创建 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"; }
}
我尝试过使用可变参数:
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 );
}
...但是每当我尝试调用该函数时,在可变参数中使用通配符泛型都会产生编译错误
我还尝试过构建一个列表
:
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 );
}
}
...但是当我尝试添加
到列表时,这也无法编译。
以下内容有效,但需要强制转换(如果我传入Object.class
,则不会出现编译错误或警告):
private void runNoMatchTests ( Class... enumTypes ) {
for( Class enumType : enumTypes ) {
for( MyEnumType value : ( (Class<MyEnumType>)enumType ).getEnumConstants() ) {
handleValue( value );
}
}
}
如何在不使用强制转换的情况下完成此操作?可以不使用类型转换来完成吗?
最佳答案
我不完全确定为什么会出现这种情况,但是如果您更改<T extends Enum<T> & MyEnumType>
,您的第一次尝试可以编译。至<T extends Enum<?> & MyEnumType>
如下图:
private <T extends Enum<?> & MyEnumType> void handleTypes(Class<? extends T>... enumTypes) {
...
}
关于java - 集合或可变参数中的通用枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22947764/