2

我的代码是:

import java.util.*;

public class A {
public static void main(String[] args){
    List<String> list = new ArrayList();
    list.add("1"); //ok   line 1
    list.add(1); //error  line 2
}

当我运行这段代码时,Java 给了我一个错误,我知道为什么,但即使我只使用第 1 行,编译器也会警告我。为什么我会收到此警告?我不明白我的第一个示例和这段代码有什么区别:

import java.util.*;

public class A {
    public static void main(String[] args){
        List<String> list = new ArrayList<String>(); // <-- notice the second <String>
        list.add("1"); //ok   line 1
        list.add(1); //error  line 2
    }
}
4

4 回答 4

5

当我运行这段代码时,Java 给了我一个错误,我知道为什么,但即使我只使用第 1 行,编译器也会警告我。为什么我会收到此警告?

当你使用你的代码时,编译器会给你一个警告,比如

List<String> list = new ArrayList();

ArrayList 是一种原始类型。应该参数化对泛型类型 ArrayList 的引用

它说您还必须为 ArrayList 提供参数化类型。

List<String> list = new ArrayList<String>();

编辑:

正如@newacct 所建议的那样:如果您使用的是Java 7,则可以在实例化您的集合时使用空尖括号(<>),例如:

List<String> list = new ArrayList<>();

Java 7 文档

只要编译器可以从上下文推断类型参数,您就可以用一组空类型参数 (<>) 替换调用泛型类的构造函数所需的类型参数。

于 2012-12-08T20:51:21.753 回答
1

代码 2 无法编译,因为您不能将int(or Integer) 添加到带有Strings 的列表中,但您已经知道这一点。

说到代码 1,编译器可能会出于多种原因向您发出警告,具体取决于您使用的编译器以及编译器使用的设置。以下是一些选项:

  • 在构造参数化对象时,您还必须指定参数。在这段代码:List<String> list = new ArrayList()中,ArrayList对象的构造没有参数,另一方面,在参考中给出了参数。编译器建议您List<String> list = new ArrayList<String>()改用。
  • 您正在使用冗余类型参数。使用代码List<SomeType> list = new ArrayList<SomeType>();时,您已经两次指定参数应该是类型SomeType。编译器建议您使用菱形推理( new ArrayList<>())。从 Java 版本 1.7 开始使用该建议。

我猜你的编译器警告你上面的第一个选项。但是,我的编译器在测试您的代码时没有给出任何警告。

于 2012-12-08T20:56:39.280 回答
1

这可能有助于理解泛型的概念:为什么使用泛型

如果您按如下方式更改代码,则不会出现错误和警告:

import java.util.*;
public class A{

public static void main(String[] args){
    List<Object> list = new ArrayList<Object>();
    list.add("1"); //ok   code 1
    list.add(1); //error  code 2

}
}
于 2012-12-08T20:58:53.650 回答
0

你有一个字符串类型的列表,所以你不能放入整数。

于 2012-12-08T20:50:33.687 回答