2012-10-31 46 views
3

動機:我想構建一個枚舉,它代表一些價值族的所有可能的值(我在此猶豫地說「類」)。枚舉將有其他方法,字段,甚至可能實現其他接口。那麼我想這個枚舉傳遞給另一種方法,它會遍歷所有可能的值(使用Enum.values(),並做了一些工作。Java:我如何傳遞一個代表Enum類的值?

我研究後發現,枚舉Foo實際上變成Foo extends Enum<Foo>。這就是爲什麼我無法擴展枚舉我試圖定義我的方法的參數爲:

myMethod(Class<?> bar) {...} 
myMethod(Class<? extends Enum> bar) {...} 
myMethod(Class<? extends Enum<?>> bar) {...} 

,但裏面的方法,當我嘗試一些基本的東西,如:。

int i = bar.values().length; 

失敗有一些其他我可以做到這一點(或避免需要做到這一點)?

注意:我可以傳遞枚舉的實例並使用bar.getDeclaringClass()來查找枚舉類(而不是實例),但這非常難看。

+0

這聽起來像是你真的在描述一個「迭代器」。 –

+0

@HotLicks也許,但OP正在尋找更多。 Java枚舉可以很好地作爲一個多層次的邏輯宇宙。 –

回答

11

嘗試使用以下:

<E extends Enum<E>> void myMethod(Class<E> enumType) { 
    E[] values = enumType.getEnumConstants(); 
    ... 
} 

getEnumConstants()文檔:

返回枚舉類或空的元素,如果這類對象 不表示枚舉類型。

編輯:如果您正在使用實現共享接口不同枚舉類型,你可以修改你的方法,以便能夠調用接口的方法。例如:

interface Fooable { 
    void foo(); 
} 

... 

<E extends Enum<E> & Fooable> void myMethod(Class<E> enumType) { 
    E[] values = enumType.getEnumConstants(); 
    for (E value : values) { 
     value.foo(); 
    } 
} 
+0

+ +1爲通用方法和使用「&」的教程獎金。我打算使用實現其他接口的枚舉類型。 OP的關鍵是使用getEnumConstants()而不是values()。我採取了我以前的嘗試,並取代了前者,後者也起作用。爲什麼values()不起作用? (並且謝謝) – ags

+0

基本上'values()'是一個爲任何'enum'類型自動聲明的靜態方法。但是'bar'(或者在我的示例'enumType'中)本身不是一個類型 - 它是一個表示類型的對象,只能調用像getEnumConstants()這樣的實例方法。 –

+0

這很有道理。是否有任何東西(可能在反射包中)允許構造一個可以代表實際類定義的對象?例如:MagicType替換; standin.makeClassFromMagicType(classArg).someStaticMethod(); – ags

相關問題