Java枚举类型中的字段类型为枚举类型

3

不确定如何表达问题,请随意更新。 我有一个复杂的枚举,它基于枚举值引用其他枚举,例如:

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...

我希望在另一个类中能够像这样编写代码:

EFormSw.OBJ_KEY_LIST.enumType.values().someThingElse().

只有当字段类型清楚地表明这是一个枚举时,才有可能实现这一点。是否有任何方法可以实现这一点?

2
你是不是指像 EFormSw.OBJ_KEY_LIST.enumType.values() 这样的东西?我不明白你怎么能直接从 EFormSw 访问到 enumType。你必须使用 OBJ_KEY_LISTOBJ_NOTE_LIST - Sweeper
@Sweeper:是的,当然,那是个错字。谢谢你指出来! - Daniel Methner
1
这就引出了一个问题,如果你知道它是 OBJ_KEY_LIST,为什么不能直接执行 EObjKeyType.values() 呢?如果你不知道它是哪个常量,那么你只会得到一个由 Enum<?> 组成的数组,因为每个常量都有不同类型的 enumType,而你并不知道它是哪一个。这对你实际上有用吗? - Sweeper
代码片段是对主题的简化,以使问题更加精确地呈现在SO问题中。在实际代码中,将对EFormSw枚举进行迭代,从而引发此问题。 - Daniel Methner
1个回答

2
你可以将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[]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接