2012-08-10 118 views
7

我試圖具有延伸的通用接口枚舉的集合,所以像:Enum <?擴展接口>

interface Fooable 
{ 
    void someCommonMethod(); 
} 

enum E1 implements Fooable 
{ 
    // some enumuerations and a definition for someCommonMethod() 
} 

enum E2 implements Fooable 
{ 
    // some different enumerations and a different definition for someCommonMethod() 
} 

,然後利用這個別處通過強制執行這兩個,一個變量是一個枚舉實現接口。因此沿線的東西..

bar(Enum<? extends Fooable> fe) 
{ 
    fe.ordinal(); 
    fe.someCommonMethod(); 
} 

然而,到目前爲止,我似乎有投FE爲了把它當作實現接口,即

bar(Enum<? extends Fooable> fe) 
{ 
    fe.ordinal(); 
    ((Fooable)fe).someCommonMethod(); 
} 

,雖然這應該是安全......這似乎並不理想,我可能會忽視某些事情。當然,如果我嘗試將參數作爲Fooable傳遞,那麼我會拋出它將其視爲Enum,不僅如此,我現在還不安全。如下圖:

bar(Fooable fe) 
{ 
    // potentially unsafe cast! 
    ((Enum<?>)fe).ordinal(); 
    fe.someCommonMethod(); 
} 

有什麼我俯瞰或者是

Enum<? extends Fooable> 

約接近一個「好」的解決方案,我會得到什麼?

我對Java相對比較陌生,並且還在追趕自己,試圖像C或C++一樣使用它,所以如果我把它當作一把錘子而不是鋸子或者忽略某種東西,可以隨意指出它:)

回答

1

一種選擇你哈ve是將您需要的Enum中的任何方法添加到Fooable中,或者創建一個擴展Fooable並添加所需的Enum方法的新接口。

例子:

interface Fooable { 
    void someCommonMethod(); 
} 

interface FooableEnum extends Fooable { 
    int ordinal(); 
} 

enum E1 implements FooableEnum { 
    // Implement someCommonMethod. 
    // ordinal() is already implemented by default. 
} 

一旦你做到了這一點,你可以在你的方法簽名使用FooableEnum作爲參數類型,而不用擔心任何的通用的東西。

+0

我想過這件事,但我對它的行爲有所保留,值(),可能值得重新審視,因爲現在我無法疏通有效的保留... – Khanmots 2012-08-10 22:29:03

+0

這需要一個不必要的接口。 – 2012-08-10 22:55:58

+0

@Mike,我越想越想越是正確的道路。我的要求並不是真的,類型**是一個枚舉,而是它具有枚舉的**行爲**。我也相信自己價值()的東西不會是一個問題,並且我是愚蠢的。 – Khanmots 2012-08-10 22:59:02

18

這表示T擴展Enum並實現Fooable:

<T extends Enum<T> & Fooable> 

因此,你的方法可以寫成:

<T extends Enum<T> & Fooable> void bar(T fe) { 
    fe.ordinal(); 
    fe.someCommonMethod(); 
} 
+0

是的,但我的理解是這只是用於聲明一個通用的方法沒有定義參數? – Khanmots 2012-08-10 21:58:05

+2

@Khanmots [方法本身可以是通用的](http://docs.oracle.com/javase/tutorial/extra/generics/methods.html)。 – 2012-08-10 21:58:31

+0

沒有想到這種方法......曾經試驗過使用T的接口擴展Enum &Fooable ,但可能必須仔細研究使封閉類通用,以便它的所有方法都可以有一個T與兩個約束... – Khanmots 2012-08-10 22:01:34