为什么编译器不给出错误或给List l = new LinkedList <string>()</string>发出警告

时间:2013-12-10 09:10:59

标签: java generics

让我解释一下这个场景。

如果我没错,Generics中的java仅用于编译时类型安全。 如果我写

List<String> list = new LinkedList<String>();  // fine
list.add("test");  // fine

这很好。但是 如果我写

List list = new LinkedList<String>();  // fine
list.add(9);  // fine

这里我创建了LinkedList字符串,List变量指向LinkedList。 允许将integer插入list

现在,Generics与类型相关。Type Listgenerics而我没有写List<String> list,即generics 因此,在创建object而不在左侧书写时,在右侧书写List不会使generic List list = new LinkedList<String>(); 。 那么为什么编译器不会在运行/编译时为后续语句

提供警告ar异常
Generics

java中使用{{1}}时编写此类声明是无用的。

5 个答案:

答案 0 :(得分:2)

您不应使用泛型类型List实例化原始类型List<T>。编译器会给你一个警告;但是,这可以通过Type Erasure完成。

答案 1 :(得分:2)

实际上,如果你写的话,你会得到一个“rawtypes”警告:

List list = new LinkedList<String>();

答案 2 :(得分:2)

如果使用

打开编译器警告,编译器将显示这些警告
-Xlint:rawtypes,unchecked

-Xlint:all

请参阅Non-Standard Options

javac docs部分

答案 3 :(得分:0)

从JDK 1.5开始,Java引入了Generics,它用于定义Collection内容的类型。 如果你像这样初始化一个ArrayList ..

List list  = new ArrayList();

然后列表可以包含任何类型的数据,它可以是String,Integer或Object。但如果你想用特定的数据类型定义你的List,你可以用尖括号来定义它,就像这样..

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

答案 4 :(得分:0)

是的,这将使用原始类型警告进行编译,您可以插入任何类型的Object。由于类型擦除,它也将在运行时工作。

但这应该避免,因为它没有意义。