2017-09-04 14 views
2

ジェネリックとenumを使用してコードを設計しようとしています。私はプリミティブな整数を使用して列挙型を取得したいだけでなく、文字列を保持する必要があります。私は多くの列挙型を持っているので、public toString()getIndex()、およびgetEnum()のメソッドをオーバーライドすることを忘れないようにインターフェイスで実装しました。しかし、タイプセーフティ警告、どのようにそれを取り除くためのアイデア、そしてなぜそれが起こっているのかを知っていますか?Java EnumとGenericsの組み合わせ

public interface EnumInf{ 
    public String toString(); 
    public int getIndex(); 
    public <T> T getEnum(int index); 
} 

public enum ENUM_A implements EnumInf{ 
    E_ZERO(0, "zero"), 
    E_ONE(1, "one"), 
    E_TWO(2, "two"); 

private int index; 
private String name; 
private ENUM_A(int _index, String _name){ 
    this.index = _index; 
    this.name = _name; 
} 
public int getIndex(){ 
    return index; 
} 
public String toString(){ 
    return name; 
} 
// warning on the return type: 
// Type safety:The return type ENUM_A for getEnum(int) from the type ENUM_A needs unchecked conversion to conform to T from the type EnumInf 
public ENUM_A getEnum(int index){ 
    return values()[index]; 
} 
+0

FYI、インターフェースは無用であるに '' toString()を宣言します。すべての 'オブジェクト'はすでにそれを宣言しています。実装するクラスでオーバーライドするだけで済みます。 – ajb

答えて

3

これを試してみてください:

public interface EnumInf<T extends EnumInf<T>> { 
    public int getIndex(); 
    public T getEnum(int index); 
} 

public enum ENUM_A implements EnumInf<ENUM_A> { 
    ... the rest of your code 

を(私はコメントで述べたように、インターフェイスにtoString()を宣言するには無意味である。)

+0

おかげさまで、警告の削除をどうやって説明することができますか? – user2609825

+0

私のコードでは、 'ENUM_A EnumInf EnumInf 'と言うとき、コンパイラは 'T'が' ENUM_A'と同じであることを直接知ることができるので、メソッドの戻り値の型は同じです。元のコードでは、明らかにそれを理解するのに十分な情報がありません。これは、実装方法の戻り値の型が、共分散のためにインターフェイスメソッドと同じである必要はないからです。しかし、私は本当に確かに分かりません。 – ajb

+0

生のタイプを使用しています – newacct

関連する問題