Java 中是否有通用枚举?
Are there Generic Enums in Java?
我正在尝试编写一个 for 循环来遍历枚举。那部分很简单,格式是:
for( SomeDeclaredEnumType e : SomeDeclaredType.values() ){
/* do stuff here */
}
但是,欺骗我的部分是遍历通用枚举。如果我有两个枚举,一个有 5 个元素,一个有 7 个元素,我如何告诉 Java 遍历它们?
本质上,我想执行以下操作:
Enum e; // generic type enum
FiveEnum f; // enum with 5 elements
SevenEnum s; // enum with 7 elements
switch (condition) {
case 0:
e = FiveEnum; /* assign e to FiveEnum */
break;
case 1:
e = SevenEnum; /* assign e to SevenEnum */
break;
}
For (Enum e : Enum.values()) {
/* iterate 5 or 7 times, depending on the case conditional */
}
有办法吗?一个安全的方法来做到这一点?最好使用 Java 库中的泛型,因为不允许我创建新的枚举。谢谢!
Enum
确实是泛型;具体来说,它的类型是Enum<E extends Enum<E>>
。这有点令人困惑,但这意味着每个枚举都将自身作为类型参数包含在内。
您的代码可以这样写(假设 FiveEnum
和 SevenEnum
在其他地方声明):
Class<? extends Enum<?>> enumClass = null;
switch (condition) {
case 0:
enumClass = FiveEnum.class;
break;
case 1:
enumClass = SevenEnum.class;
break;
}
for (Enum<?> e : enumClass.getEnumConstants()) {
// loop body
}
不要声明 Enum e
来分配 class,而是使用 Class<? extends Enum<?>>
。然后在每个 case 语句中分配正确的 class 文字。最后,在底部的 for
循环中,使用 Class
's getEnumConstants
method 循环遍历所有枚举常量。
Class<? extends Enum<?>> clazz;
int condition = 0; // or 1
switch (condition) {
case 0:
clazz = FiveEnum.class; /* assign FiveEnum */
break;
case 1:
clazz = SevenEnum.class; /* assign SevenEnum */
break;
// Added default case so clazz is always initialized.
default:
throw new IllegalArgumentException("" + condition);
}
for (Enum e : clazz.getEnumConstants()) {
/* iterate 5 or 7 times, depending on the case conditional */
}
我正在尝试编写一个 for 循环来遍历枚举。那部分很简单,格式是:
for( SomeDeclaredEnumType e : SomeDeclaredType.values() ){
/* do stuff here */
}
但是,欺骗我的部分是遍历通用枚举。如果我有两个枚举,一个有 5 个元素,一个有 7 个元素,我如何告诉 Java 遍历它们? 本质上,我想执行以下操作:
Enum e; // generic type enum
FiveEnum f; // enum with 5 elements
SevenEnum s; // enum with 7 elements
switch (condition) {
case 0:
e = FiveEnum; /* assign e to FiveEnum */
break;
case 1:
e = SevenEnum; /* assign e to SevenEnum */
break;
}
For (Enum e : Enum.values()) {
/* iterate 5 or 7 times, depending on the case conditional */
}
有办法吗?一个安全的方法来做到这一点?最好使用 Java 库中的泛型,因为不允许我创建新的枚举。谢谢!
Enum
确实是泛型;具体来说,它的类型是Enum<E extends Enum<E>>
。这有点令人困惑,但这意味着每个枚举都将自身作为类型参数包含在内。
您的代码可以这样写(假设 FiveEnum
和 SevenEnum
在其他地方声明):
Class<? extends Enum<?>> enumClass = null;
switch (condition) {
case 0:
enumClass = FiveEnum.class;
break;
case 1:
enumClass = SevenEnum.class;
break;
}
for (Enum<?> e : enumClass.getEnumConstants()) {
// loop body
}
不要声明 Enum e
来分配 class,而是使用 Class<? extends Enum<?>>
。然后在每个 case 语句中分配正确的 class 文字。最后,在底部的 for
循环中,使用 Class
's getEnumConstants
method 循环遍历所有枚举常量。
Class<? extends Enum<?>> clazz;
int condition = 0; // or 1
switch (condition) {
case 0:
clazz = FiveEnum.class; /* assign FiveEnum */
break;
case 1:
clazz = SevenEnum.class; /* assign SevenEnum */
break;
// Added default case so clazz is always initialized.
default:
throw new IllegalArgumentException("" + condition);
}
for (Enum e : clazz.getEnumConstants()) {
/* iterate 5 or 7 times, depending on the case conditional */
}