Java继承 - 无法将父对象转换为子对象?

时间:2016-05-02 02:49:39

标签: java inheritance casting

我一直在学习Java中的继承,我不确定你是否可以将Parent对象转换为Child对象。我本以为这是好的(但另一种方式是禁止),但在阅读完主题后,我认为 不能 。我想问一下论坛是否正确。

假设我有一个名为FruitCart的程序,它可以处理许多类对象:

public class Fruit{
    String color;
    boolean hasSeeds;

    public Fruit(String a, boolean b){
        this.color = a;
        this.hasSeeds = b;
    }
}

public class FruitCart{
    public static void main(String[] args){ 
        Fruit fruitA = new Fruit("red", true);
        Fruit fruitB = new Fruit("yellow", false);
        ...many more...
    }
}

好。现在假设随着我的程序的继续,它会学习更多关于购物车中水果的属性。例如,也许我的程序得知fruitA的类型为“Red Delicious”。我们现在知道fruitA是一个苹果,将fruitA从类Fruit的实例转换为Apple类的实例会很棒:

public class Apple extends Fruit{
    String type;

    public Apple(String a, boolean b, String c){
        super(a, b);
        this.type = c;
    }
}

我的问题是......是否不可能将FruitA从Fruit转变为Apple对象?

public class FruitCart{

    public static void main(String[] args){

        Fruit fruitA = new Fruit("red", true);

        fruitA = new Apple(, "Red Delicious");    // nope
        ...or...
        fruitA = (Apple)fruitA;                   // no good
        ...or...
        Apple appleA = (Apple)fruitA;             // nada

    }
}

我一直在谷歌搜索超过一个小时,正如我所说,我认为答案是否定的。这篇文章让我这么认为:

Casting in Java(interface and class)

但是,我没有足够的经验知道我正在阅读的材料是否与我在这里描述的问题直接相关。这里的人可以确认吗?

非常感谢,       -RAO

2 个答案:

答案 0 :(得分:0)

如果“source”引用所引用的实例是相同类型或类型的子类型,则只能将具有给定类型的引用强制转换为其他给定类型的引用“目的地”参考。

如果你有

public class A {}

public class B extends A {}

public class BB extends A {}

public class C extends B {}

然后以下内容将起作用:

A a = new C();
B b = (B) a;
C c = (C) a;

相比之下,这些都不起作用:

A a = new BB();
B b = (B) a;
C c = (C) a;

请记住,即使在有效的情况下,演员也不会改变任何内容。所有更改都是引用的类型,您通过它引用实例。它对实例没有任何作用。它不会以任何方式“转换”实例。

答案 1 :(得分:-1)

除非PARENT类包含CHILD类或其派生类的实例,否则不能将PARENT类转换(转换)为CHILD类。

public class Parent{ 
    public String getNameOfClass(){
      return "Parent";
    } 
}  // parent class
public class Child extends Parent{
   public String getNameOfClass(){
      return "Child";
    }
}  // child class

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Parent p = new Child();
     Child c = (Child) p;
    System.out.println(c.getNameOfClass());
}

输出为child

来自维基百科

  

许多人主张避免向下倾斜,因为根据LSP,   一个需要它的OOP设计是有缺陷的。[引证需要]一些   语言,如OCaml,完全不允许向下转发。[1]

     

一个经过深思熟虑的设计的流行例子是top的容器   类型,如Java泛型引入之前的Java容器,   这需要向下传播所包含的物体,以便它们可以   再次使用

因此,我们可以看到Parent对象是否被实例化为Child类,然后它将工作并将进行编译,但是如果没有这样做,则会产生编译时错误。