我对DownCasting和Upcasting知之甚少,但令我困惑的是代码。
假设我有一个类Parent和Child扩展了这个类
public class Parent {
public Parent methodA()
{
System.out.println("Parent");
return this;
}
}
public class Child extends Parent{
public void methodB()
{
System.out.println("In Child");
}
}
public static void main(String[] args) {
Parent p = new Child();
Child c=(Child) p.methodA();
}
我的困惑是在Parent Class方法A中,如果我返回Parent的新实例,那么代码会抛出运行时异常但如果我返回相同的实例,那么为什么我不会得到错误。
public Parent methodA()
{
System.out.println("Parent");
return new Parent(); // in this case downcasting throws error
}
答案 0 :(得分:2)
如果p.methodA()
返回相同的实例(即p),它将返回Child
个实例(因为p被分配了new Child()
),可以安全地转换为Child
但是,如果p.methodA()
返回新的Parent
实例,则该实例不是Child
,并且无法转换为Child
。
答案 1 :(得分:2)
变量p
实际上包含Child
并在methodA()
上调用Child
,methodA()
从Parent
继承this
。因此,Child
在这种情况下属于Parent
类型。
但是如果你返回Child
(新的与否无关紧要),则无法将其转换为{{1}},因为它不是孩子。
答案 2 :(得分:1)
当你说return this;
时,你发回一个指向内存中对象的指针。方法签名上指定的返回类型告诉调用者返回的对象是“可查看的”Parent
对象(换句话说,使用Parent
类定义声明的接口)。现在,当你调用p.methodA()它仍然返回this
引用时,它仍然可以作为Parent
对象查看,但它也是Child
对象:所以你不会有向Child
转发的任何问题。
在第二个实现中,您明确返回Parent
对象的新实例... 不是Child
,因此您将拥有{{ 1}}