[英]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...
我希望能夠在另一堂課上做的是寫一些類似的東西
EFormSw.OBJ_KEY_LIST.enumType.values().someThingElse().
這只有在字段類型清楚這是一個枚舉時才有可能。
有什么方法可以實現這一目標嗎?
您可以使enumType
成為Class<? extends Enum<?>>
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[]
來代替。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.