Collection或vararg参数中的通用枚举

时间:2014-04-08 20:43:15

标签: java generics enums

我正在尝试创建一个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 );
      }
   }
}

如何在不使用演员表的情况下完成此操作?可以不使用演员表来完成吗?

1 个答案:

答案 0 :(得分:1)

我不完全确定为什么会出现这种情况,但如果您将<T extends Enum<T> & MyEnumType>更改为<T extends Enum<?> & MyEnumType>,则可以编译您的第一次尝试,如下所示:

private <T extends Enum<?> & MyEnumType> void handleTypes(Class<? extends T>... enumTypes) {
    ...
}