[英]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.