[英]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
。 這里重要的是String
和String.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
。 它也不知道類型名稱通常是大寫的。 因此,它的錯誤信息有時很難解釋為一個人在腦海里徘徊所有的背景。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.