泛型类型的非泛型对象

时间:2013-08-07 10:45:16

标签: java generics

以下代码:

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);
                  ^

这两段代码都因无效输入而失败。那么为什么编译器会针对第二段代码发出未经检查或不安全操作的警告?

4 个答案:

答案 0 :(得分: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
    // ...
}

答案 1 :(得分:2)

因为在第二个代码中,您没有指定ArrayList的类型参数。您可以在Java 7中将其编写为:

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

答案 2 :(得分:0)

这里有两个不同的问题。

首先 -

ArrayList<String> ar = new ArrayList();

您告诉编译器ar是一个字符串列表,但您将其分配给 raw 类型列表(即无限制)。因此编译器会警告您未经检查或不安全的操作。您应该使用以下任一选项:

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

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

(第二个选项是Java 7示例,只是减少了您必须执行的输入量。结果是相同的。)

其次 -

ar.add(45);

您正在将一个整数(45)添加到字符串列表中。编译器不允许您这样做。

答案 3 :(得分:0)

将您的通用数据类型更改为Integer

如果你想添加整数