在查找(测试)另一个问题的信息时,我偶然发现了一些事情,完全不知道它为什么会发生。现在,我知道没有实际理由这样做,而且这是绝对可怕的代码,但为什么这个代码能够工作:
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()方法可以工作呢?当你把鼠标放在Eclipse上时,它不是应该返回Quod的实例吗?如果它可以返回一个只是对象的对象,而承诺返回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());
为什么我不能在Object上调用toString?为什么println()方法可以调用它的toString,但是我不能直接调用它?
编辑:我知道我没有对我创建的第一个ArrayList实例做任何事情,所以它基本上只是浪费处理时间。
编辑:我正在使用Java 1.6上的Eclipse。其他人说他们在运行Java 1.8的Eclipse中获得相同的结果。然而,在一些其他编译器上,无论哪种情况都会抛出CCE错误。
ArrayList<Quod>
添加任何内容,当你重新分配test
时,你正在丢弃对它的引用。 - azurefrogprintln
接受一个String
参数。所有其他类都使用接受Object
的版本。 - Ian McLaird