2012-08-10 7 views
7

私のような共通のインターフェースを拡張する列挙型の集まりなので、何か持ってしようとしています:列挙型<?拡張インターフェース>

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(); 
} 

...の線に沿って何かがしかし、これまでのところ、私は

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

、これがあるべきながら、すなわち、インターフェースを実装するとして、それを治療するためにFEをキャストするために持っているように見えます安全な...それは次善のようだと私は何かを見落としている可能性があります。もちろん、私がちょうどFooableとしてparamを渡そうとすると、それをEnumとして扱うためにキャストしているだけでなく、私は今も安全ではありません。以下を参照してください:

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

ものがあり、私は私が買ってあげると「良い」解に近づけ程度

Enum<? extends Fooable> 

を望むかですよ?

私はJavaには比較的新しいので、CやC++のように使ってみたいと思っていますので、鋸の代わりにハンマーのように扱っていたり、何か愚かなことを見落としています。

<T extends Enum<T> & Fooable> 

したがって、あなたの方法は、以下のように書くことができる:

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

答えて

1

一つの選択肢あなたヘクタール

+0

私はこれについて考えていましたが、値()に関する振る舞いについて予約していましたが、今のところ私は有効な予約を捨てることができませんが、再訪する価値はあるかもしれません... – Khanmots

+0

これは、 。 –

+0

@Mike、もっと私はこれが正しい道だと思います。私の要求は実際には**タイプが** enummではない、それはenumの**動作**を持つということです。私はまた、価値観が問題にならないと私が愚かであることを自分自身に確信させました。 – Khanmots

18

これは、TはFooable列挙型を拡張して実装していることを意味し必要な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

+2

@Khanmots [メソッド自体は一般的なものです](http://docs.oracle.com/javase/tutorial/extra/generics/methods.html)。 –

+0

そのアプローチは考えていませんでした... T extends Enumで汎用インターフェースを使用することを実験していましたが、包括クラスを汎用にすることで、すべてのメソッドがTの両方の制約を持つT ... – Khanmots

関連する問題