如何将不同枚举类实例存入列表并传入构造器?
问题解决方案
核心问题分析
你遇到的错误根源有两个:
A/B/C是Enums类的内部枚举,但它们的父类是java.lang.Enum,和Enums类无继承关系,因此List<Enums>无法存储这些枚举实例。- 代码中存在笔误:
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
相关产品推荐
相关产品推荐

