簡體   English   中英

當我使用String類型參數枚舉vector時,我得到了ClassCast異常,但沒有異常,其中Integer作為類型參數

[英]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()和不同參數類型的函數,這稱為(方法重載):

  1. 的System.out.println(字符串)
  2. 的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) ,它接受StringInteger ,因此一切順利。

旁注:默認情況下,您應該使用ArrayList而不是Vector ,由於Vector傳統方法,它具有更清晰的界面。 同時Vector它是同步造成不必要的開銷。

暫無
暫無

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

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