2017-07-21 9 views
3

2つの簡単なメソッドでクラスを作成したいと思います。最初に、処理する必要がある型を登録します。 2番目は登録されたすべてのタイプを処理します。私が持っている問題は、登録/処理したいクラスに一定の制限があることです。実装してインターフェイスを持つEnumでなければなりません。Java:インタフェースを実装するEnumのコレクションを定義する方法

保存に使用するコレクションを定義する方法登録された型。私のコードの簡略化されたバージョンは次のとおりです:

public class Example { 
    interface MyType { 
     // Add methods here 
    } 

    private List<what-goes-here?> store = new ArrayList<>(); 


    public <T extends Enum<?> & MyType> void registerType(@Nonnull Class<T> type) { 
     store.add(type); 
    } 


    public void processAll() { 
     for (T t : store) {   // Where do I define T? 
      // process t 
     } 
    } 
} 
+3

コードが矛盾しています。 'register'では、' process'の中の 'Class'オブジェクトをリストに格納していますが、' T'インスタンスがそこから出てくることを期待しています。それ以外に、これらのオブジェクトが 'enum'であることがなぜ重要なのでしょうか?そのプロパティに依存するようには見えないし、それがどのように有用な財産になるか想像するのは難しいです。 – Holger

+0

@Holgerこんにちは、彼はすべての列挙定数インスタンスを処理したいと思います。 –

+2

@ holi-java質問者は私たちに彼らの意図について推測する必要はありません。彼らが実際にやりたいことに応じて、もっと良い解決策がたくさんあるでしょう。 – Holger

答えて

4

どうやってですか?

public class Example { 

    interface MyType { 
     // Add methods here 
    } 

    //     v--- save it as enum class 
    private List<Class<? extends Enum<?>>> store = new ArrayList<>(); 


    public <T extends Enum<?> & MyType> void registerType(@Nonnull Class<T> type) { 
     store.add(type); 
    } 


    public void processAll() { 
     //   v--- iterate each enum type 
     for (Class<? extends Enum<?>> type : store) { 
      Enum<?>[] constants = type.getEnumConstants(); 
      for (Enum<?> constant : constants) { 
       //v--- downcasting to the special interface 
       MyType current = (MyType) constant; 
       // TODO 
      } 
     } 
    } 

} 
+0

は 'Object'を保持するストアを宣言しているだけで、あなたがキャストしている限り、実際には問題はありません。 – Eugene

+0

@Eugeneこんにちは、あなたのフィードバックに感謝します。 'Class'を' Object'として保存すると、 'processAll'で未確認の警告が生成されるので、' MyType'ではなく 'Enum 'として保存します。私はそうですか? :) –

+0

私は知っていますが、あなたは明らかにそれを抑えることができます...あなたは 'store'をとにかく公開していません(私的です)。あなたがそれを公開すると、 'MyType current =(MyType)constant'は理論的にはまだ失敗します。なぜなら、いくつかのenumインスタンスは' MyType'を実装しないからです。 – Eugene

関連する問題