java - 集合或可变参数中的通用枚举

标签 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"; }
}

我尝试过使用可变参数:

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/

相关文章:

java - future 预测支付金额计划

java - jpa实体管理器回滚不起作用

c# - 使用 C# 泛型的助手

c# - C++ 中的枚举类 - 替换 - 在 C# 中

java - 基于字符串的二叉树和插入

java - IntelliJ编译显示错误

c++ - 在具有枚举键的 map 中使用整数作为键

C (gnu11) enum 变量无法与 int 进行比较?

c# - 传入和返回自定义数据——接口(interface)是正确的方法吗?

c# - 当其中一个函数具有带约束的泛型参数时,无法声明两个同名函数