簡體   English   中英

通用類型的非通用對象

[英]Non-generic object of generic type

對於以下代碼:

ArrayList<String> ar = new ArrayList<String>();
ar.add(45);

ArrayList<String> ar = new ArrayList();
ar.add(45);

我在ar.add(45)行收到編譯時錯誤,如下所示:

cannot find symbol
symbol  : method add(int)
location: class java.util.ArrayList<java.lang.String>
                al.add(45);
                  ^

這兩段代碼均因無效輸入而失敗。 那么,為什么編譯器對第二段代碼發出未經檢查或不安全操作的警告?

那么,為什么編譯器對第二段代碼發出未經檢查或不安全操作的警告?

因為您正在將ArrayList分配給類型為ArrayList<String>的變量。 這意味着盡管編譯器將強制執行以下期望:當您通過ar引用該列表時,數組列表將僅包含字符串,但不能確保您沒有其他將要引用的非參數化ArrayList引用。用於向其添加非字符串,如下所示:

ArrayList anythingGoes = new ArrayList();
ArrayList<String> onlyStrings = anythingGoes; // Unchecked/unsafe op
anythingGoes.add(new Date());
for (String s : onlyStrings) { // Blows up
    // ...
}

因為在第二個代碼中您沒有指定ArrayList的類型參數。 您可以在Java 7中將其編寫為:

ArrayList<String> ar = new ArrayList<>();

這里有兩個不同的問題。

首先 -

ArrayList<String> ar = new ArrayList();

您是在告訴編譯器ar是字符串列表,但您是將其分配給原始類型列表(即無限制)。 因此,編譯器將警告您未檢查或不安全的操作。 您應該在下面使用任一選項:

ArrayList<String> ar = new ArrayList<String>();

要么

ArrayList<String> ar = new ArrayList<>();

(第二個選項是Java 7示例,只是減少了您要做的鍵入次數。結果是相同的)。

其次 -

ar.add(45);

您正在將整數(45)添加到字符串列表中。 編譯器不允許您執行此操作。

將通用數據類型更改為Integer

如果要添加整數

暫無
暫無

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

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