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.Enum
和 java.lang.Object
中声明的大部分方法,因此如果您只需要这些,您可以直接使用它。)
如果您想使用 EObjKeyType
和 EObjNoteType
之间共享的一些通用功能,您可以将所有通用功能提取到它们都实现的通用接口中:
interface EObjType {
// ...
}
enum EObjKeyType implements EObjType {
// ...
}
enum EObjNoteType implements EObjType {
// ...
}
然后将enumType
改为:
private final Class<? extends EObjType > enumType;
现在您可以获得 EObjType[]
。
不确定如何表述问题,请随时更新。 我有一个复杂的枚举,它根据枚举值引用其他枚举,如下所示:
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.Enum
和 java.lang.Object
中声明的大部分方法,因此如果您只需要这些,您可以直接使用它。)
如果您想使用 EObjKeyType
和 EObjNoteType
之间共享的一些通用功能,您可以将所有通用功能提取到它们都实现的通用接口中:
interface EObjType {
// ...
}
enum EObjKeyType implements EObjType {
// ...
}
enum EObjNoteType implements EObjType {
// ...
}
然后将enumType
改为:
private final Class<? extends EObjType > enumType;
现在您可以获得 EObjType[]
。