簡體   English   中英

Java:使用枚舉的動態類型轉換

[英]Java: Dynamic type casting using enums

我正在努力做一些事情:

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

    ...
}

列是內部枚舉,如下所示:

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

我理解為什么B行不起作用,但我沒有得到的是為什么C不起作用。 如果我在除了類型Columns.RANK.type任何其他地方使用Columns.RANK.type ,它工作正常,但我試圖對類進行類型轉換,它編譯說它無法在枚舉中找到RANK ,這不應該是案件。

如何解決?

謝謝!

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

簡短的回答是,使用枚舉沒有好辦法。 axtavt的答案可能是你最好的選擇。 trashgod基本上是正確的,為什么C不起作用,但也許它可以使用更多的解釋。

您需要考慮編譯器如何解釋C 這里重要的是StringString.class之間的區別。 你有一個像(String)foo這樣的轉換表達式。 在這樣的表達式中,您要轉換的類型(在該示例中為String )必須是類型的名稱。 你不會寫(String.class)foo ,因為沒有名為String.class類。 (相反, String.class只是一個對象,一個反映String類型的java.lang.Class實例。)

of the type that bguiz wants to cast to." 所以,編譯時看到(Columns.RANK.type)(values[Columns.RANK.index])它說:“啊,這是一個鑄造的表達。所以,一開始在括號中位必須是 bguiz想要施放的類型。“ 然后它盡職盡責地尋找名為Columns.RANK.type的類型。 因為它是一個類型的名稱,所以它期望它的形式為my.package.containing.a.Type.AndMaybe.SomeInnerTypes 因此,它將它分開. s,找到類型Columns ,然后關閉並在Columns查找名為RANK的內部類型。 沒有這樣的內部類型(常量RANK不計算),因此它會因您引用的錯誤而失敗。

(如果發現它,它將繼續尋找另一種稱為type內部type ,並且再次,枚舉中的字段將不計數。)

請記住,編譯器只是遵循一堆愚蠢的規則。 它並不關心你的Columns枚舉中也有一個恆定的RANK 它也不知道類型名稱通常是大寫的。 因此,它的錯誤信息有時很難解釋為一個人在腦海里徘徊所有的背景。 :)

在引用類文字時 ,表達式Columns.RANK.type的類型為Class<String> 它不是Cast表達式所需的ReferenceType

附錄:編譯器認為你的意思是引用一個名為RANK的不存在的類,它嵌套在Columns

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM