在查找(测试)另一个问题的信息时,我遇到了一些问题,完全不知道为什么会这样.现在,我知道没有实际的理由这样做,这是绝对可怕的代码,但为什么这是有效的:
ArrayList<Quod> test=new ArrayList<Quod>();
ArrayList obj=new ArrayList();
test=obj;
obj.add(new Object());
System.out.println(test.get(0));
Run Code Online (Sandbox Code Playgroud)
所以,基本上,我将一个Object添加到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());
Run Code Online (Sandbox Code Playgroud)
为什么我不能在对象上调用toString?为什么println()方法调用它的toString很好,但不是直接用于我?
编辑:我知道我没有对我创建的第一个ArrayList实例做任何事情,所以它实际上只是浪费处理时间.
编辑:我在Java 1.6上使用Eclipse其他人说他们在运行java 1.8的Eclipse中得到了相同的结果.但是,在其他一些编译器上,两种情况都会引发CCE错误.