【问题标题】:Java: Generic accepting only enum typesJava:泛型只接受枚举类型
【发布时间】:2012-07-15 11:45:25
【问题描述】:

假设我有一个基本的枚举,例如:

public enum Color { Red, Green, Blue}

如何编写一个只接受“枚举类”的泛型类,以使该泛型类的具体实例看起来像MyClass<Color>

编辑:

真正想要做的是编写一个通用抽象类,其中包含一个将所有枚举“条目”作为列表返回的函数:

public abstract class EnumListBean<E extends Enum<E>> {

    public List<E> getEnumList() {
        return Arrays.asList(E.values());
    }

}

虽然Day.values() 可用,但E.values() 不可用。我在这里做错了什么?

【问题讨论】:

  • 不,它的实现不应仅限于一种具体的枚举类型,而应限于任意枚举类型。我只是用Day 更具体地描述了我想要的。

标签: java generics enums


【解决方案1】:
public class EnumAcceptor<E extends Enum<E>> {
    ...
}

在你的类中使用 E 作为类型。

【讨论】:

    【解决方案2】:

    有关原始问题的答案,请参阅 Istvan Devai。

    对于后续操作,values() 之类的方法是静态方法,因此尝试从泛型参数中获取它是不走运的。作为一个糟糕的解决方案,您可以将枚举的 Class 对象传递给构造函数。并使用Class.getEnumConstants。但是您最好将MyEnum.values() 传递给构造函数而不是类,因此完全避免反射。没有一个合理的枚举元类真是太可惜了。

    【讨论】:

      【解决方案3】:

      enum 确实声明了一个派生自 Enum 的类。因此,您可以使用:

      public class MyClass<T extends Enum> { }
      

      【讨论】:

      • 您正在混合泛型和原始类型。
      【解决方案4】:

      请注意,@Istvan 的解决方案只能接受enum元素,如果这就是你想要的,那很好。

      虽然您不能将enum 本身作为参数传递(因为它实际上没有等效对象),但您可以指定您必须在构造函数中接收enumclass 并派生@987654325 @的详细信息:

      public class EnumAcceptor<E extends Enum<E>> {
        public EnumAcceptor(Class<E> c) {
          // Can get at the enum constants through the class.
          E[] es = c.getEnumConstants();
        }
      
        enum ABC {
          A, B, C;
        }
      
        public static void main(String args[]) {
          EnumAcceptor<ABC> abcAcceptor = new EnumAcceptor<ABC>(ABC.class);
        }
      }
      

      【讨论】:

      • 糟糕 - @Tom 的帖子重复 - 对不起 Tom :(
      【解决方案5】:

      由于类型擦除,您不能使用 E.values() -- E 的类型在运行时不可用。

      对于您问题中的具体情况,您最好使用GuavaLists.newArrayList

      List<Color> days = Lists.newArrayList(Color.values());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多