Java:使用枚举的动态类型转换

bgu*_*uiz 6 java enums casting

我正在努力做一些事情:

public void setContents(Object[] values)
{
    ...

        //A. this works
        mRank =
            ((String)(values[Columns.RANK.index])); 

        //B. doesn't work (entire line underlined by netbeans)
        mRank =
            (Columns.RANK.type.cast(values[Columns.RANK.index]));
        //incompatible types: required java,lang.String found: java.lang.Object

        //C. doesn't work (first RANK is underlined by netbeans)
        mRank =
            ((Columns.RANK.type)(values[Columns.RANK.index]));
        //cannot find symbol symbol: class RANK location: blah.blah.Columns

    ...
}
Run Code Online (Sandbox Code Playgroud)

列是内部枚举,如下所示:

public static enum Columns
{

    RANK(0, "Rank", String.class),
    NUMBER(1, "Number", Integer.class);

    public String text;
    public Class type;
    public int index;

    private Columns(int idx, String text, Class clasz)
    {
        this.type = clasz;
        this.text = text;
        this.index = idx;
    }
}
Run Code Online (Sandbox Code Playgroud)

我理解为什么行B不起作用,但我没有得到的是为什么C不起作用.如果我使用Columns.RANK.type除了类型转换之外的任何其他地方,它工作正常,但我尝试与类进行类型转换,它编译说它无法RANK在枚举中找到,这不应该是这种情况.

如何解决?

谢谢!

axt*_*avt 4

C不起作用,因为Columns.RANK.type在编译时无法访问。

但是,B可以使用自定义的基于泛型的类来实现,而不是enum

class Columns<T>
{
    public static final Columns<String> RANK = new Columns<String>(0, "Rank", String.class);
    public static final Columns<Integer> NUMBER = new Columns<Integer>(1, "Number", Integer.class);

    public final Class<T> type;
    public final String text; 
    public final int index; 

    private Columns(int idx, String text, Class<T> clasz) 
    { 
        this.type = clasz; 
        this.text = text; 
        this.index = idx; 
    } 
}
Run Code Online (Sandbox Code Playgroud)