2009-07-14 11 views
2

をとるインタフェースを実装するクラス、私はシンプル列挙し、それを使用するクラス持っていると言う:それぞれ、だから、列挙型

enum ThingType { POTATO, BICYCLE }; 

class Thing { 
    public void setValueType(ThingType value) { ... } 
    public ThingType getValueType() { ... } 
} 

をしかし、現実には、私はsetValueTypeを実装する別のクラスの多くを持っています異なる種類の列挙型を使用します。私は、これらのクラスは、それがジェネリックを使用してsetValueTypeとgetValueTypeをサポートして実装できるインターフェイスを作りたい:

interface ValueTypeable { 
    public Enum<?> getValueType(); // This works 
    public <T extends Enum<T>> setValueType(T value); // this fails horribly 
} 

クラスは、XMLスキーマ(JAXB)から自動生成されているので、私はクラスモデルを変更することはできません。私は列挙型とジェネリックを組み合わせたものではないと感じています。ここでの目標は、ユーザーが(実行時に型をすでに知っているように)列挙型のリストから選択し、特定のクラスの値を設定できるようにすることです。

ありがとうございます!

答えて

3

インターフェイス自体をパラメータ化しようとしましたか?

class Thing<E extends Enum<? extends E>> { 
    public E getValueType(); 
    public void setValueType(E value); 
} 

その後、あなたはサブクラスは正しい型で1を拡張しています:ような - 固定値の間違いセット

class SomeSubClass implements Thing<ThingType> { ... } 
+1

おそらく、バインド内の 'Enum'について心配する必要はありません。 –

+0

これは間違いなく機能しますが、jaxbインターフェイスのコードジェネレータは汎用インターフェイスをサポートしていません。しかしそれは修正するのが難しくないかもしれません。 – lucasmo

0

列挙型は、それらの固定セットがある場合です。各実装に独自のものがあると言うと、固定セットはなくなり、enumをどのように使用しようとしているのかがニーズに合っていません。

あなたはrequest for Java to be able to have abstract enumsに興味があるかもしれません。

+0

まあ、各クラスがそのそれと対1つの列挙型を持っています。私が望むのは、これらの列挙型クラスが実装できるインターフェイスです。プログラムでそれらを識別し、インターフェイスから呼び出すことができます。代わりに、クラスのタイプを含む個々のテストがあります。これは保守性の悪夢になります。 – lucasmo