泛型类型的非泛型对象

Mac*_*Mac 0 java generics

对于以下代码:

ArrayList<String> ar = new ArrayList<String>();
ar.add(45);
Run Code Online (Sandbox Code Playgroud)

和

ArrayList<String> ar = new ArrayList();
ar.add(45);
Run Code Online (Sandbox Code Playgroud)

我在编译时遇到错误ar.add(45):

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

这两段代码都无法输入无效的内容.那么为什么编译器会针对第二段代码提出未经检查或不安全操作的警告?

T.J*_*der 5

那么为什么编译器会针对第二段代码提出未经检查或不安全操作的警告?

因为您要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
    // ...
}
Run Code Online (Sandbox Code Playgroud)