【发布时间】:2011-12-08 16:09:24
【问题描述】:
我之前运行了一些测试,但找不到解释为什么这段代码会这样做:
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList(Arrays.asList(Double.valueOf(0.1234)));
System.out.println(list.get(0)); //prints 0.1234
Object d = list.get(0);
System.out.println(d.getClass()); // prints class java.lang.Double
System.out.println(list.get(0).getClass()); // ClassCastException
}
}
这引发了几个问题:
- 为什么 List
首先接受一个 Double (它应该编译吗)? - 为什么第二个打印工作而不是第三个打印工作,虽然看起来他们在做同样的事情?
编辑
我理解以下两种说法:
List aList = new ArrayList(); //I can add any objects in there
List<Integer> aList = new ArrayList<Integer>(); //I can only add something that extends Integer in there
但我不明白为什么这个是授权的,以及为什么它在运行时实际上在某种程度上有效,尽管某些操作会产生 ClassCastException - 我本来希望在上面发布的代码的第一行出现 ClassCastException:
List<Integer> aList = new ArrayList(); //I can any objects in there
【问题讨论】:
-
在您的编辑中:这有效,因此仍然支持泛型之前的 java 版本。 (Java 在向后兼容方面付出了很多努力。)
-
经过一番思考,我在下面修改了我的答案。我认为它现在更准确地回答了为什么它会以这种方式工作。