Java继承-无法将父对象转换为子对象?
我一直在学习Java中的继承,不确定是否可以将父对象强制转换为子对象。我本以为这没关系(但另一方面是否定的),但在阅读了这个主题后,我认为这是不可能的。我想问论坛我是否正确 假设我有一个名为FruitCart的程序,它可以处理很多类Fruit对象:Java继承-无法将父对象转换为子对象?,java,inheritance,casting,Java,Inheritance,Casting,我一直在学习Java中的继承,不确定是否可以将父对象强制转换为子对象。我本以为这没关系(但另一方面是否定的),但在阅读了这个主题后,我认为这是不可能的。我想问论坛我是否正确 假设我有一个名为FruitCart的程序,它可以处理很多类Fruit对象: public class Fruit{ String color; boolean hasSeeds; public Fruit(String a, boolean b){ this.color = a;
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...
}
}
好的。现在假设随着我的程序的继续,它了解了更多关于购物车中水果的属性。例如,也许我的程序了解到水果A属于“红色美味”类型。我们现在知道水果A是一个苹果,最好将水果A从类水果实例转换为类苹果实例:
public class Apple extends Fruit{
String type;
public Apple(String a, boolean b, String c){
super(a, b);
this.type = c;
}
}
我的问题是。。。把水果扔到苹果物体上是不可能的吗
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
}
}
我已经在谷歌上搜索了一个多小时,正如我所说的,我认为答案是否定的。单是这篇文章就让我这么想:
然而,我没有足够的经验去知道我正在阅读的材料是否与我在这里描述的问题直接相关。这里的人能证实吗
非常感谢,,
-RAO除非父类持有子类或其派生类的实例,否则不能将父类强制转换为子类
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这样的语言完全不允许向下广播
考虑不周的设计的一个流行例子是顶部的容器
类型,比如引入Java泛型之前的Java容器,
这需要向下转换包含的对象,以便
再次使用
因此,我们可以看到,如果父对象被实例化为子类,那么它将工作并编译,但是如果不这样做,它将给出一个编译时错误。如果实例是“源”,则只能将一个给定类型的引用转换为另一个给定类型的引用引用是指与“目的地”引用类型相同的类型或子类型 如果你有
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;
相比之下,这些都不起作用:
A a = new C();
B b = (B) a;
C c = (C) a;
A a = new BB();
B b = (B) a;
C c = (C) a;
请记住,即使在有效的情况下,演员阵容也不会改变任何事情。它所改变的只是引用实例的引用类型。它对实例没有任何作用。它不会以任何方式“转换”实例。您始终可以从子实例转换为父实例,因为通过继承,苹果是一个果实,但果实可能不是苹果。您可以将一个水果投射到苹果上,但是最好检查(使用intansceof或比较类)以查看该投射是否可行。此外,如果对象是作为子对象创建的,则您只能向下转换,基本上您必须执行水果水果a=新苹果(参数);然后你可以做苹果=(苹果)水果;它会起作用的。
furuta=新苹果(,“红色美味”)代码>此行有语法错误(额外的逗号/缺少参数)。应该行得通,表达得很差。不能强制转换类型为父类引用的引用,除非它实际引用子类的实例。您根本不能用这种语法转换类。@EJP它在维基百科中,正如我所提到的,如果只有父类有它的子类的实例,那么它将是possible@EJP代码编译并运行良好。那么问题是什么呢?这不是最好的做法,这是不同的,但它会起作用