2016-10-05 11 views
3

の2種類のいずれかから:インスタンス化EnumSetの私は、これら2つの列挙型は、そのように宣言してい列挙

public enum EnumOne implements EnumInterface { 
    SomethingHere, 
    SomethingThere; 
    public void someMethod() { } 
} 

public enum EnumTwo implements EnumInterface { 
    SomethingOverYonder; 
    public void someMethod() { } 
} 

をここに見られるように、両者は、このインターフェイスを実装します。

public Interface EnumInterface { 
    someMethod(); 
} 

私はEnum1またはEnum2のいずれかからすべての要素を取得しますEnumSetのが含まれ、ここで定義したクラスを持っています。これは、インデックスをパラメータとして持つメソッドによって定義されます。このような何か:

public class SomeClass { 
    private EnumSet someEnum; 
    public void setEnumType (int index) { 
     switch (index) { 
     case 1: 
      someEnum = EnumSet.allOf(EnumOne.class); 
      break; 
     case 2: 
      someEnum = EnumTwo.allOf(EnumTwo.class); 
      break; 
     } 
    } 
} 

さて、私は何とかこれを達成するためにジェネリックを使用する必要があります知っているが、私はそれに十分慣れていないよので、私は正確にどのように行うのか分からないと私は願っていますあなたは私に少し啓発することができます。

ご回答いただきありがとうございます。

+0

Btw列挙型は変数名として使用できません。 – Mordechai

+0

@MouseEvent注釈をお寄せいただきありがとうございます。私はそれを編集しますが、私がやりたいことのアイデアはまだまだよく分かります。 – ShadowGeist

+0

後でEnumSet固有のメソッドを使用したい場合は、 'someEnum'宣言に適切な型パラメータを持てないので動作しません。単純に 'Set'として使うのであれば、' Set someEnum =新しいHashMap <>(EnumSet.allOf(EnumOne.class)); '。しかし、私はそれが基本的にデザインに間違っていると感じています...あなたはこのようなことをしたい理由を教えてください。 –

答えて

1

あなたが探しているものは不明ですが、あなただけのsomeEnum生型で宣言されないようにしたい場合、

public class SomeClass { 
    private EnumSet<? extends EnumInterface> someEnum; 
    public void setEnumType (int index) { 
     switch (index) { 
     case 1: 
      someEnum = EnumSet.allOf(EnumOne.class); 
      break; 
     case 2: 
      someEnum = EnumSet.allOf(EnumTwo.class); 
      break; 
     } 
    } 
} 
+0

EnumSetは、ユーザーが必要とするものに応じてEnumまたはEnumSetのすべての値を取るようにします。私は以前のコメントで、私が取り組んでいるプロジェクトは、ユーザーにさまざまな種類の家具を売ることであると述べました。家具はメラミン製または指関節の木製で作られています。ユーザは、家具がどのような木製であるかを決定する。これら2つの列挙型は、これらの2種類の木材を説明するためのものです。 – ShadowGeist

0

これは私がそれをやった方法です:

public class SomeClass {                                     

    private EnumSet<? extends EnumInterface> someEnum;                              

    // I control it, so it's checked                                  
    @SuppressWarnings("unchecked")                                   
    public <E extends Enum<E> & EnumInterface> void setEnumType(int index) {                        
     switch (index) {                                     
     case 1:                                       
      someEnum = (EnumSet<E>) EnumSet.allOf(Enum1.class);                           
      break;                                       
     case 2:                                       
      someEnum = (EnumSet<E>) EnumSet.allOf(Enum2.class);                           
      break;                                       
     default:                                       
     }                                         

    } 


    public EnumSet<? extends EnumInterface> getEnum() {                             
     return someEnum;                                     
    }  

} 

テスト:

public static void main(String[] args) {                                
    SomeClass c = new SomeClass();                                  
    c.setEnumType(2);                                     
    EnumSet<? extends EnumInterface> e = c.getEnum();                             
    System.out.println(e);                                    

    for (EnumInterface ei : e)                                   
     ei.someMethod();                                    

    }                                          

} 
+0

ええと、これは私がしたいことを達成するようです。ただ一つの質問。どのような警告がコンパイラによって投げられているのですか?それをなぜ抑制していますか?心配することはありませんよね?私の無知を許しなさい、私がそれらの1つを見るのは初めてです。 – ShadowGeist

+0

未チェックのジェネリック型キャスト – Mordechai

+0

typeパラメータがパラメータまたは戻り型で使用されていない汎用メソッドを持つことは意味がありません。 – newacct

関連する問題