Java 具有枚举类型字段的枚举

Java Enum with field of type enum

不确定如何表述问题,请随时更新。 我有一个复杂的枚举,它根据枚举值引用其他枚举,如下所示:

public enum EFormSw {

    OBJ_KEY_LIST("Object Keys", EObjKeyType.class),
    OBJ_NOTE_LIST("Object Notes",  EObjNoteType.class);

public final String label;
public final Class</*"E is an Enum"*/> enumType;

// Constructor...

我想在另一个 class 中做的是写一些类似

的东西
EFormSw.OBJ_KEY_LIST.enumType.values().someThingElse().

这只有在字段类型清楚这是一个枚举的情况下才有可能。

有什么办法可以做到这一点吗?

您可以将 enumType 设为 Class<? extends Enum<?>>:

enum EFormSw {

  OBJ_KEY_LIST("Object Keys", EObjKeyType.class),
  OBJ_NOTE_LIST("Object Notes", EObjNoteType.class);

  private final String label;
  private final Class<? extends Enum<?>> enumType;

  EFormSw(String label, Class<? extends Enum<?>> enumType) {
    this.label = label;
    this.enumType = enumType;
  }

  public String getLabel() {
    return label;
  }

  public Class<? extends Enum<?>> getEnumType() {
    return enumType;
  }
}

当你遍历 EFormSw 的值时,你可以使用 getEnumConstants 得到一个 Enum<?>[] 代表枚举类型的枚举值,但你不会能够用它做很多事情,因为你不知道它是哪种确切的枚举类型:

for (EFormSw constant: EFormSw.values()) {
    Enum<?>[] values = constant.getEnumType().getEnumConstants();
}

(您仍然可以在数组元素上调用 java.lang.Enumjava.lang.Object 中声明的大部分方法,因此如果您只需要这些,您可以直接使用它。)

如果您想使用 EObjKeyTypeEObjNoteType 之间共享的一些通用功能,您可以将所有通用功能提取到它们都实现的通用接口中:

interface EObjType {
    // ...
}

enum EObjKeyType implements EObjType {
    // ...
}

enum EObjNoteType implements EObjType {
    // ...
}

然后将enumType改为:

private final Class<? extends EObjType > enumType;

现在您可以获得 EObjType[]