2017-09-04 67 views
2

我想用泛型和枚舉設計一段代碼。我希望使用原始整數來獲得枚舉,並且它必須包含一個字符串。我有很多枚舉,所以我通過一個接口實現它們,以便記住覆蓋公共方法toString()getIndex()getEnum()。然而,我正在得到一個類型安全警告,任何想法如何擺脫它,以及爲什麼發生?結合Java枚舉和泛型

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

僅供參考,宣佈'的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 implements EnumInf '時,編譯器可以在那裏發現'T'與'ENUM_A'相同,所以方法的返回類型是相同的。在你的原始代碼中,顯然它沒有足夠的信息來解決這個問題。也許這是因爲實現方法的返回類型不必與接口方法相同,因爲協方差。但我確實不知道。 – ajb

+0

你正在使用原始類型 – newacct