2

Android Spinner から列挙値を取得できるように、以下のクラスを作成しました。

getValue()どちらにもコンパイルされない行が 2 つあります。

どうすればいいですか?

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)
    }
}
4

1 に答える 1

1

タイプ eraserにより、T実行時に意味がなくなります。これが、式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);
    }
}
于 2013-07-22T22:20:09.060 に答える