2013-07-22 51 views
2

我已經寫了下面的類來讓我從Android微調獲得枚舉值。從Android微調獲取枚舉值

getValue()中有兩行都沒有編譯。

我該怎麼做?

public class EnumSpinnerListener<T extends Enum> implements AdapterView.OnItemSelectedListener { 
    private String mValue = null; 

    public EnumSpinnerListener(AdapterView<?> adapterView) { 
     adapterView.setOnItemSelectedListener(this); 
    } 

    @Override 
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
     mValue = adapterView.getItemAtPosition(i).toString(); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> adapterView) { 
     // do nothing 
    } 

    public T getValue() { 
     return Enum.valueOf(T.class, mValue); // cannot select from a type variable 
     return T.valueOf(mValue); // valueOf(java.lang.Class<T>, String) in enum cannot be applied to (java.lang.String) 
    } 
} 

回答

1

由於type erasureT將在運行時沒有任何意義,這就是爲什麼表達T.class是非法的。解決方法是參考Class<T>實例:

public class EnumSpinnerListener<T extends Enum<T>> // note the correction here 
implements AdapterView.OnItemSelectedListener { 

    private final Class<T> type; 

    private String mValue = null; 

    public EnumSpinnerListener(Class<T> type, AdapterView<?> adapterView) { 
     this.type = type; 
     adapterView.setOnItemSelectedListener(this); 
    } 

    public T getValue() { 
     return Enum.valueOf(type, mValue); 
    } 
}