Java泛型 – 允许混合类型?

我之前正在运行一些测试,但无法找到解释为什么这段代码能够完成它的工作:

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
最佳答案
如果你写

... new ArrayList<Integer>(...

相反,它会导致编译器异常.

关于它的工作原理:

System.out.println(list.get(0)); //prints 0.1234

该方法Object.toString()是在双和整数相同的(而且由于的System.out.println()预计,这是投不进一个整数(对象编译器优化抛弃))

Object d = list.get(0);
System.out.println(d.getClass()); // prints class java.lang.Double

.getClass()也是如此.在这里,优化器再次放弃了演员.

System.out.println(list.get(0).getClass()); // ClassCastException

这实际上会从列表中创建一个Integer并且失败.它执行转换,因为优化器认为它需要这样做,因为它不是显而易见的,它不需要.

如果您将最后一行更改为:

    System.out.println(((Object)list.get(0)).getClass());

有用 :)

转载注明原文:Java泛型 – 允许混合类型? - 代码日志