Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中是否有通用枚举?_Java_Generics_Enums - Fatal编程技术网

Java中是否有通用枚举?

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循环来迭代枚举。这一部分很简单,格式如下:

  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  */
}