Java中是否有通用枚举?

时间:2015-01-23 22:41:49

标签: java generics enums

我正在尝试编写一个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库中的Generics,因为我不允许创建新的枚举。谢谢!

2 个答案:

答案 0 :(得分:4)

Enum确实是一种通用类型;具体来说,它的类型是Enum<E extends Enum<E>>。这有点令人困惑,但这意味着每个枚举都将自身包含为类型参数。

您的代码可以这样写(假设FiveEnumSevenEnum在其他地方声明):

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
}

答案 1 :(得分:2)

不是声明Enum e指定哪个类,而是使用Class<? extends Enum<?>>。然后在每个case语句中分配适当的类文字。最后,在底部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  */
}