java - 从 Android Spinner 中获取枚举值

标签 java android generics enums spinner

我编写了下面的类来让我从 Android Spinner 中获取枚举值。

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

最佳答案

由于type erasure , 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);
    }
}

关于java - 从 Android Spinner 中获取枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17784067/

相关文章:

c# - 如何传递参数来声明泛型类型列表?

java - 如何对 jar 中的 .class 文件进行 monkeypatch

Java XML vs SQL vs 自定义数据存储

java - jOOQ - DSL.dateAdd 与 Field<Timestamp>

c# - Android RatingBar的MvvmCross实现

java - 使用 OpenCv 在 Android 上组合多个位图

java - 在notifyDataSetChanged 上从RecyclerView 中删除占位符 View ?

Android Studio "Open Declaration"类似eclipse

java - 重用继承来定义Java中的方法

java - 我们如何通过使用泛型/任何其他方式删除代码冗余/改进代码