我之前运行了一些测试,但找不到关于为什么这段代码会这样做的解释:
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(它应该编译)? - 为什么第二个打印品有效而不是第三个打印品,尽管看起来他们在做同样的事情?
编辑
我理解以下 2 个陈述:
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
最佳答案
这个:
new ArrayList(Arrays.asList(Double.valueOf(0.1234)))
创建一个原始的(未类型化的)ArrayList
,您可以在其中放置任何内容。这是正确的做法:
new ArrayList<Integer>(Arrays.asList(Double.valueOf(0.1234)))
现在不应该编译。
关于Java 泛型 - 允许混合类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8433969/