【问题标题】:How to Create a List of Different Enum Classes如何创建不同枚举类的列表
【发布时间】:2021-12-30 16:14:08
【问题描述】:

我想创建一个不同枚举类的列表,并能够访问列表中这些枚举的值。例如,考虑两个枚举:

enum Enum1 {
  ENUM1_VALUE_1, ENUM1_VALUE_2;
}

enum Enum2 {
  ENUM2_VALUE_1, ENUM2_VALUE_2;
}

我想构造一个 Enum1 和 Enum2 的列表,以便我可以打印 Enum1 和 Enum2 的值。

它看起来像这样,但这显然不能编译:

List<Enum> enumList = Arrays.asList(Enum1, Enum2);
for (Enum enumEntry: enumList) {
    System.out.println(enumList.values());
}

有什么想法吗?

【问题讨论】:

    标签: java enums


    【解决方案1】:

    混合枚举对象

    让两个类实现相同的接口,并使用您需要的任何方法。

    然后创建包含该接口对象而不是枚举类的列表。

    提示:从 Java 16 开始,可以在本地定义接口、枚举和记录。

    interface Animal {}
    
    enum Pet implements Animal { DOG, CAT ; }
    enum Wild implements Animal { LION , ORCA ; }
    
    List< Animal > felines = List.of( Pet.CAT , Wild.LION ) ;
    

    混合枚举类

    如果枚举的是你想要收集的,使用Class类。

    List< Class > myEnumClasses = List.of( Pet.class , Wild.class ) ;
    

    Java 中的枚举隐式扩展了Enum 类。所以我们可以更具体地使用我们的列表类型。

    List < Class < ? extends Enum > > myEnumClasses = List.of( Pet.class , Wild.class );
    

    myEnumClasses.toString(): [类 demo.App$1Pet,类 demo.App$1Wild]

    关于最后一部分,您的最终目标是循环 Enum 类以在每个类上调用隐式 Enum 方法 public static T[] values()……使用在 Class 类上找到的特殊方法:getEnumConstants。该方法返回枚举对象的数组。

    为方便起见,我们可以将该数组传递给List.of,以便通过调用List#toString 轻松生成枚举对象的文本表示。

    for ( Class < ? extends Enum > e : myEnumClasses )
    {
        System.out.println( "e = " + e );
        System.out.println( List.of( e.getEnumConstants() ) );  // Pass the array T[] to `List.of` for convenient printing.
    }
    

    运行时。

    e = class demo.App$1Pet
    [DOG, CAT]
    e = class demo.App$1Wild
    [LION, ORCA]
    

    【讨论】:

    • 是的,这在理论上可行,但它可能会破坏拥有枚举的目的。因为我不相信我可以创建一个既是枚举又实现我定义的公共接口的对象。编辑:感谢您提供示例,但是我希望有一个避免必须列出枚举值的实现。换句话说,我想构建一个 PET 和 WILD 列表,并能够访问一个方法(希望是静态的values 方法)来列出它们的所有值。
    • @user699279 查看我的编辑。
    • 混合枚举类是我的用例,而且效果很好!感谢您的帮助。但是,我会提到 List&lt;Enum&gt; 不会编译。至少对我来说,在 Java 11 上,它必须是 List&lt;Class&lt;? extends Enum&gt;&gt;
    • @user699279 感谢您的反馈。我还没有掌握? extends 等Java 泛型的精妙之处。我修复了答案。另外,我发现Class#getEnumConstants 是获取每个Enum 子类的对象的关键。我更新了示例代码以适应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2017-08-19
    相关资源
    最近更新 更多