私のような共通のインターフェースを拡張する列挙型の集まりなので、何か持ってしようとしています:列挙型<?拡張インターフェース>
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();
}
私はこれについて考えていましたが、値()に関する振る舞いについて予約していましたが、今のところ私は有効な予約を捨てることができませんが、再訪する価値はあるかもしれません... – Khanmots
これは、 。 –
@Mike、もっと私はこれが正しい道だと思います。私の要求は実際には**タイプが** enummではない、それはenumの**動作**を持つということです。私はまた、価値観が問題にならないと私が愚かであることを自分自身に確信させました。 – Khanmots