【问题标题】:My generic EnumSet method - can't access Enum.values()我的通用 EnumSet 方法 - 无法访问 Enum.values()
【发布时间】:2013-03-05 17:54:38
【问题描述】:

我正在尝试编写一个通用方法,用于从包含位掩码的整数初始化 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 菜鸟。)有人可以帮我解决这个编译器错误吗?谢谢。

【问题讨论】:

    标签: java generics enumset


    【解决方案1】:

    您不能直接对泛型类型进行操作,因为在运行时类型擦除会将所有这些替换为Object。因此,上面的代码将执行Object.values(),这显然是行不通的。

    这样做的方法是使用Class.getEnumConstants()

    为此,您需要EClass 对象的E 实例。同样,请记住,在运行时类型擦除将删除对泛型类型的所有引用。

    尝试类似:

    private <E extends Enum<E>> void setEnumSet(E[] values,
          EnumSet<E> es, int iEnum )
    

    private <E extends Enum<E>> void setEnumSet(Class<E> type, 
          EnumSet<E> es, int iEnum )
    

    【讨论】:

    • 谢谢,约翰。我传入了 values 数组。似乎多余,但它完成了工作。再次,tyvm——尤其是及时性! :)
    【解决方案2】:

    作为传入值数组的替代方法,您可以从EnumSet 恢复Class&lt;E&gt;。如果集合不为空,请使用set.iterator().next().getDeclaringClass();如果集合为空,则使用EnumSet.complementOf(set) 获取非空集合,然后像以前一样获取一个元素并获取其类。 (奇怪的是,EnumSet 没有提供直接获取枚举类的方法,尽管必须将其存储起来以供complementOf 工作。)

    拥有 Class 对象后,请使用 John B 的回答中提到的Class.getEnumConstants

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 2019-09-09
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多