泛型究竟是如何工作的?
在查找(测试)另一个问题的信息时,我遇到了一些东西,完全不知道为什么会发生这种情况。现在,我知道没有实际理由这样做,这绝对是可怕的代码,但是为什么这是有效的:
ArrayList<Quod> test=new ArrayList<Quod>();
ArrayList obj=new ArrayList();
test=obj;
obj.add(new Object());
System.out.println(test.get(0));
所以,基本上,我正在向Quods的ArrayList中添加一个对象。现在,我看到java没有办法有效地检查这一点,因为它必须查看所有引用,这些引用可能甚至没有存储在任何地方。但是为什么 get() 有效。get() 不是假设返回一个 Quod 实例,就像你在 Eclipse 中将鼠标放在它上面时所说的那样吗?如果它承诺返回 Quod 类型的对象时,它可以返回一个仅是对象的对象,为什么当我说我将返回一个 int 时,我不能返回一个字符串?
事情变得更加奇怪。这崩溃,因为它假设与运行时错误(java.lang.ClassCastException错误)(!?!?):
ArrayList<Quod> test=new ArrayList<Quod>();
ArrayList obj=new ArrayList();
test=obj;
obj.add(new Object());
System.out.println(test.get(0).toString());
为什么我不能在对象上调用 toString?为什么 println() 方法可以调用它的 toString,而我却不能直接调用它?
编辑:我知道我没有对我创建的第一个ArrayList实例做任何事情,所以这本质上只是浪费处理时间。
编辑:我在Java 1.6上使用Eclipse其他人说他们在运行java 1.8的Eclipse中得到了相同的结果。但是,在其他一些编译器上,这两种情况都会引发 CCE 错误。