使用新的和相同的返回类型实例在Java中向下转换

时间:2015-02-16 15:42:09

标签: java oop inheritance

我对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
 }

3 个答案:

答案 0 :(得分:2)

如果p.methodA()返回相同的实例(即p),它将返回Child个实例(因为p被分配了new Child()),可以安全地转换为Child

但是,如果p.methodA()返回新的Parent实例,则该实例不是Child,并且无法转换为Child

答案 1 :(得分:2)

变量p实际上包含Child并在methodA()上调用ChildmethodA()Parent继承this。因此,Child在这种情况下属于Parent类型。

但是如果你返回Child(新的与否无关紧要),则无法将其转换为{{1}},因为它不是孩子。

答案 2 :(得分:1)

当你说return this;时,你发回一个指向内存中对象的指针。方法签名上指定的返回类型告诉调用者返回的对象是“可查看的”Parent对象(换句话说,使用Parent类定义声明的接口)。现在,当你调用p.methodA()它仍然返回this引用时,它仍然可以作为Parent对象查看,但它也是Child对象:所以你不会有向Child转发的任何问题。

在第二个实现中,您明确返回Parent对象的新实例... 不是Child ,因此您将拥有{{ 1}}