【发布时间】:2015-02-20 18:34:58
【问题描述】:
在查找(测试)另一个问题的信息时,我遇到了一些事情,完全不知道为什么会发生这种情况。现在,我知道没有实际理由这样做,而且这绝对是可怕的代码,但为什么它会起作用:
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时不能返回一个String?
事情变得更奇怪了。这会崩溃,因为它会出现运行时错误(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 错误。
【问题讨论】:
-
您没有向
ArrayList<Quod>添加任何内容,而是在重新分配test时丢弃了对它的引用。 -
对我来说,在 java 1.6 中的 eclipse 中,前一个输出 java.lang.Object@1e63e3d 并且没有抛出任何错误
-
你为什么要删除你的答案?这是迄今为止最好的,我会在 5 分钟计时器结束后立即接受它
-
It's still not that simple.(使用 sun-jdk-7)
-
@pbabcdefp,这是因为
println的特殊版本采用String作为参数。所有其他类都使用采用Object的版本。
标签: java eclipse generics arraylist