我之前进行了一些测试,但无法找到为什么这段代码会执行以下操作的解释:
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<Integer>首先接受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