Java中是否有通用枚举?
我正在尝试编写一个for循环来迭代枚举。这一部分很简单,格式如下:Java中是否有通用枚举?,java,generics,enums,Java,Generics,Enums,我正在尝试编写一个for循环来迭代枚举。这一部分很简单,格式如下: for( SomeDeclaredEnumType e : SomeDeclaredType.values() ){ /* do stuff here */ } 然而,欺骗我的部分是通过泛型枚举进行迭代。如果我有两个枚举,一个有5个元素,一个有7个元素,我如何告诉Java遍历它们? 基本上,我想做以下几点: Enum e; // generic type enum FiveEnum
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
。这有点让人困惑,但这意味着每个枚举都包含自己作为类型参数
您的代码可以这样编写(假设FiveEnum
和SevenEnum
在其他地方声明):
Class>enumClass=null;
开关(条件){
案例0:
enumClass=FiveEnum.class;
打破
案例1:
enumClass=SevenEnum.class;
打破
}
对于(枚举e:enumClass.getEnumConstants()){
//环体
}
使用类>
而不是声明枚举e
来分配哪个类。然后在每个case语句中指定适当的类文本。最后,在底部for
循环中,使用循环遍历所有枚举常量
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 */
}
Class>clazz;
int条件=0;//或1
开关(条件){
案例0:
clazz=FiveEnum.class;/*分配FiveEnum*/
打破
案例1:
clazz=SevenEnum.class;/*分配SevenEnum*/
打破
//添加了默认情况,因此clazz始终处于初始化状态。
违约:
抛出新的IllegalArgumentException(“+”条件);
}
对于(枚举e:clazz.getEnumConstants()){
/*根据情况,迭代5或7次*/
}
@JamesB这不正确。枚举是类,Enum
是泛型类型。如果您发现自己经常需要类似的功能,这可能表明这些东西不应该是枚举。您能解释一下我是如何做到的吗?我可以把它添加到我的类中吗,比如“私有类E扩展了枚举{}”?很抱歉,我最初的回答不是很清楚;编辑。
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 */
}