使用泛型与Java集合的意外行为

时间:2014-04-09 18:28:19

标签: java generics collections

奇怪的是我刚刚意识到:

Java文档声明List集合有一个方法T get(int index)...如您所见,该方法返回T

但是我能做到:

List<Integer> l1 = new ArrayList<>();
l1.add(1);
List l2 = l1;
l2.add("Hello my friend");
Object o2 = l1.get(1);
System.out.println(o2);

结果是&#34;你好我的朋友&#34; ! ......这不符合文档中的规定,因为结果应为整数!

还有其他可能的解释吗?

3 个答案:

答案 0 :(得分:3)

泛型是编译时检查。一旦你开始使用原始类型,所有的赌注都会被取消......你是谁。这是为什么原始类型是危险的,不应该在新代码中使用。

答案 1 :(得分:1)

List l2不是通用的,因此它基本上是List<Object>,当您使用非通用列表时,添加到它的所有内容都变为Object,您可以自行决定使用它们正确的,或者你会得到ClassCastException s。

答案 2 :(得分:0)

如果你已经将l2声明为泛型,那么你就会得到一个编译时错误(如果你的编译器被配置为抱怨这些东西)。

final List<Integer> l2 = l1;