![](/img/trans.png)
[英]ClassCast Exception at Runtime when I want to cast a Type into its Sub for cloning
[英]I get ClassCast exception when I enumerate vector with String type parameter, but no exception is there with Integer as type parameter
我正在嘗試向量並編寫一個簡單的代碼來通過枚舉訪問它的元素。
Vector v = new Vector();
v.add("Some String");
v.add(10);
Enumeration e = v.elements();
while(e.hasMoreElements()) System.out.println(e.nextElement());
使用原始類型會按預期生成結果(打印元素)。 但是,當我使用泛型類型的枚舉器時,它變得棘手。
使用String作為類型參數:
Vector v = new Vector();
v.add("Some String");
v.add(10);
Enumeration<String> e = v.elements();
while(e.hasMoreElements()) System.out.println(e.nextElement());
輸出:
一些字符串
線程“main”java.lang.ClassCastException中的異常:java.lang.Integer無法強制轉換為java.lang.String
使用Integer作為類型參數:
Vector v = new Vector();
v.add("Some String");
v.add(10);
Enumeration<Integer> e = v.elements();
while(e.hasMoreElements()) System.out.println(e.nextElement());
輸出:
一些字符串
10
這里發生了什么? 兩個案例都不應該產生ClassCast異常嗎?
請注意,所有泛型都在編譯時被刪除,這只是為了幫助編譯器確認您沒有犯錯。 可能你會在這幾點得到幾個警告,說你不應該使用原始類型(原始意味着Vector
而不是Vector<String>
等)。 原始類型的泛型相當於<?>
表示您將允許任何類型(請注意,這將導致您的代碼不再編譯)。
您看到的行為是因為有兩個(實際上是幾個,但在您的情況下使用了兩個)具有名稱System.out.println()
和不同參數類型的函數,這稱為(方法重載):
在編譯時,決定為您的代碼調用哪個。
在String示例中,枚舉具有泛型類型String
,並將調用第一個。 但是,當它從Vector
傳遞一個Integer
對象時,這會在將其轉換為String時導致失敗。 所以在這種情況下,編譯器將您的代碼轉換為以下(粗略):
Enumeration e = v.elements();
while(e.hasMoreElements()) System.out.println((String)e.nextElement());
在Integer示例中,枚舉具有泛型類型Integer
,它將映射到System.out.println(Object)
,它接受String
和Integer
,因此一切順利。
旁注:默認情況下,您應該使用ArrayList
而不是Vector
,由於Vector
傳統方法,它具有更清晰的界面。 同時Vector
它是同步造成不必要的開銷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.