2016-04-18 18 views
0

こんにちはSO人。私は、私のenumの内部enum値を返すことに関して問題があります。私は使用する戻り値の型がわかりません。私はグーグルで試してみましたが、いくつかのソリューションを使用してジェネリックを使用しましたが、まだ運がありません。私の質問に解決策があるかどうか、あるいは私が悪い設計をしたかどうかは分かりません。だからここに行く の下に私の列挙です。Javaの戻り値の型enum値

public enum KEYS 
{ 
    A("value"), 
    B("value"), 
    C("value"); 

    public enum KEYS_GROUP_A 
    { 
     ITEM_A ("value"), 
     ITEM_B ("value"), 
     ITEM_C ("value"); 

     private String value; 
     private KEYS_GROUP_A(String _value) 
     { 
      value = _value; 
     } 

     public String getVal() 
     { 
      return value; 
     } 
    } 

    public enum KEYS_GROUP_B 
    { 
     ITEM_A ("value"), 
     ITEM_B ("value"), 
     ITEM_C ("value"); 

     private String value; 
     private KEYS_GROUP_B(String _value) 
     { 
      value = _value; 
     } 

     public String getVal() 
     { 
      return value; 
     } 
    } 

    public enum KEYS_GROUP_C 
    { 
     ITEM_A ("value"), 
     ITEM_B ("value"), 
     ITEM_C ("value"); 

     private String value; 
     private KEYS_GROUP_C(String _value) 
     { 
      value = _value; 
     } 

     public String getVal() 
     { 
      return value; 
     } 
    } 

    private String value; 
    private PROPERTY_KEYS(String _value) 
    { 
     value = _value; 
    } 

    public String getVal() 
    { 
     return value; 
    } 

    public <?> getEnumValues(int x) 
    { 
     if (0 == x) 
     { 
      return KEYS.KEYS_GROUP_A.values(); 
     } 
     else if (1 == x) 
     { 
      return KEYS.KEYS_GROUP_B.values(); 
     } 
     else 
     { 
      return KEYS.KEYS_GROUP_C.values(); 
     } 
    } 
} 

私がしようとしているのは、getEnumValues()メソッドです。返品タイプ<T extends Enum<T>> Tを試しましたが、依然としてエラーが発生します。私のデザインが悪いのか、本当にやるべきでないのかを教えてください。いくつかの参考文献を述べてください。私は読んで喜んで学びます。光を当ててください!前もって感謝します!

+0

「エラーが発生しました」はエラーの説明ではありません。スタックトレースがある場合は、それを投稿してください。コンパイルエラーがある場合は、エラーを転記してください。 – khelwood

+0

コンストラクタをKEYS_GROUP_BおよびKEYS_GROUP_Cで監視します。 3つのネストされたすべての列挙体の名前がKEYS_GROUP_Aであるコンストラクタのコピー・ペースト・エラー。 PROPERTY_KEYS - それは何ですか?代わりにKEYSを意味しましたか? – Madhusudhan

+1

'(0 == x)'はコンパイルされません。あなたは 'int'と' String'を比較しています。 –

答えて

3

あなたが返すことができ、最も具体的なタイプは、あなたがこのようなインタフェースを定義する場合は、より多くの「有用な」タイプを返すことができ

public Enum<?>[] getEnumValues(int x) 

です:

interface HasVal { String getVal(); } 

、あなたの列挙型は、すべてのことを実施しますインターフェース、例えば:

public enum KEYS_GROUP_A implements HasVal { 
    // ... 

    @Override public String getVal() { return value; } 
} 

次にあなたが

を返すことができます。
public HasVal[] getEnumValues(int x) 

およびインスタンス上getValメソッドを呼び出すことができ:これは一般的なのために充足されていないため、

public <T extends Enum<T>> T[] getEnumValues(int x) 

for (HasVal val : getEnumValues(x)) { 
    System.out.println(val.getVal()); 
} 

は、あなたが使用することはできませんがT

enum Blah {} 

をしてから起動してみてください:たとえば、私が定義することができ

Blah[] blah = getEnumValues(1); 

コードパスの少なくとも一つ(だけでなく、すべて、実際に)ので、タイプセーフではないことBlah[]と共変しない値を返します。

+0

この戻り値をどのように反復することができますか?1つの質問ですが、最初にgoogleでチェックしてみましょう。もう一度ありがとう!! :) – Oneb

+1

それは単なる配列です。for(Enum 値:getEnumValues(i) ){} '。 –

+0

ありがとうございました!あなたはロック!:) – Oneb