![](/img/trans.png)
[英]How to get valueOf & values of an Enum and call methods on an interface it implements when defined as a generic class param
[英]Get values of generic enum that implements an interface
我有以下界面:
public interface GenericMethods {
public String getString();
}
通過這個接口,我實現了這個枚舉:
public enum SpecificEnum implements GenericMethods {
A("NOT"), B("RELATED"), C("TEXT");
SpecificEnum(String string) {
this.string = string;
}
private String string;
@Override
public String getString() {
return this.string;
}
}
現在,我希望能夠使用參數SpecificEnum.class
調用函數,並能夠調用該參數上的values()
函數,以及返回數組元素上的接口方法。 像這樣的東西:
class Main {
public static void main(String[] args) {
for (GenericMethods gm : getEnums(SpecificEnum.class)) {
System.out.printf(gm.getString());
}
}
public static T[]<T extends GenericMethods> getEnums(Class<T> enum1) {
enum1.values();
}
}
但是,經過大量搜索,我還沒有遇到使用泛型與同時實現接口的枚舉的情況。 我也對泛型類型進行了很多思考,但我找不到正確的語法來在泛型枚舉類上調用values()
。 主要目標是以相同的方式管理多個相關的枚舉。
我懷疑你可能正在尋找類似的東西:
public static <T extends Enum<T> & GenericMethods> T[] getEnums(Class<T> enum1) {
return enum1.getEnumConstants();
}
public static void main(String[] args) {
for (GenericMethods gm : getEnums(SpecificEnum.class)) {
System.out.println(gm.getString());
}
}
結果:
(演示: https : //ideone.com/v6on2p )
NOT
RELATED
TEXT
變化:
<T extends GenericMethods>
因為只有泛型方法可以聲明其泛型類型。<T extends Enum<T> & GenericMethods>
以強制 T 也是某些 Enum 的子類型,除了實現 GenericMethodsgetEnumConstants()
而不是values()
因為我們使用的是Class
,而不是enum
類型。對Class
對象調用getEnumConstants()
。 正如 javadoc 所說:
如果此 Class 對象不表示枚舉類型,則返回此枚舉類的元素或
null
。
你的方法的簽名也是錯誤的。 以下是如何編寫它:
public static <T extends GenericMethods> T[] getEnums(Class<T> enumClass) {
return enumClass.getEnumConstants();
}
當然,它可能會返回null
,因為不能保證Class
對象是一個枚舉類。 例如,對於以下類, getEnums(Foo.class)
返回null
:
public class Foo implements GenericMethods {
@Override
public String getString() {
return "Boo!!";
}
}
要確保Class
是枚舉類,請將方法更改為:
public static <T extends Enum<T> & GenericMethods> T[] getEnums(Class<T> enumClass) {
return enumClass.getEnumConstants();
}
測試
getEnums(Foo.class); // fails to compile
SpecificEnum[] enums = getEnums(SpecificEnum.class);
System.out.println(Arrays.toString(enums));
輸出
[A, B, C]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.