You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将不同枚举类实例存入列表并传入构造器?

问题解决方案

核心问题分析

你遇到的错误根源有两个:

  1. A/B/C是Enums类的内部枚举,但它们的父类是java.lang.Enum,和Enums类无继承关系,因此List<Enums>无法存储这些枚举实例。
  2. 代码中存在笔误:B.value("b1")、C.value("c1")应改为B.valueOf("b1")、C.valueOf("c1")。

修正步骤

1. 正确存储不同类型的枚举

使用Enum<?>作为列表泛型,它能兼容所有枚举类型:

List<Enum<?>> eValues = new ArrayList<>();
eValues.add(Enums.A.valueOf("a1"));
eValues.add(Enums.B.valueOf("b1"));
eValues.add(Enums.C.valueOf("c1"));

2. 调整Course构造器以接收多类型枚举

原构造器的泛型<T extends Enum<T>>只能接收同一种枚举类型的数组,无法兼容不同枚举,因此需要修改参数类型:

方式一:接收Enum<?>数组
public class Course {
    public Course(Enum<?>[] eValues) {
        // 处理枚举示例:遍历获取类型和值
        for (Enum<?> e : eValues) {
            String enumType = e.getClass().getSimpleName();
            String enumValue = e.name();
            System.out.printf("枚举类型:%s,值:%s%n", enumType, enumValue);
        }
    }
}

调用时将列表转为数组:

Course c = new Course(eValues.toArray(new Enum[0]));
方式二:直接接收List<Enum<?>>
public class Course {
    public Course(List<Enum<?>> eValues) {
        for (Enum<?> e : eValues) {
            // 处理逻辑
        }
    }
}

调用时直接传入列表:

Course c = new Course(eValues);
方式三:使用可变参数(更简洁)

如果想直接实现new Course(a1, b1, c1)的调用方式,可以定义可变参数构造器:

public class Course {
    public Course(Enum<?>... eValues) {
        // 处理逻辑与数组版本一致
    }
}

调用示例:

Course c = new Course(Enums.A.a1, Enums.B.b1, Enums.C.c1);

内容的提问来源于stack exchange,提问作者Gopi Sai Ponnada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:15:35