【问题标题】:Down Casting in Java [duplicate]Java中的向下转换[重复]
【发布时间】:2013-05-03 17:29:57
【问题描述】:

这里有人可以解释一下为什么我在将父级向下转换为子级时得到 java.lang.ClassCastException 吗?

public class Child extends Parent{
public static void main(String[] args){
    new Child().go();
}
void go(){
    go2(new Parent(), new Child());
    go2((Child) new Parent(), new Child());
}
void go2(Parent p1, Child c1){
    Child c2 = (Child)p1;
    Parent p2 = (Parent)c1;
} 
}
class Tree{}

我已阅读参考变量转换并在网络上搜索示例。有人可以向我解释一下吗?我真的很想了解它为什么会抛出异常。谢谢

【问题讨论】:

  • 你将不是孩子的父母转换为孩子
  • 它没有通过 IS-A 测试:一个孩子 IS-A 父母,但父母不是孩子。

标签: java casting downcast


【解决方案1】:

假设您是父类动物和子类鸟。 你可以从鸟施法到动物,因为所有的鸟都是动物。 您不能从动物转换为鸟,因为并非所有动物都是鸟。

【讨论】:

  • 那么我该如何为父母申请向下转换?
  • 父级比子级“低”。所以这将是“上播”。并且“upcasts”是不可能的。也许你可以告诉我更多,为什么你需要那个演员,以及你到底想做什么。
【解决方案2】:

这是您有问题的代码被剥离:

go2(new Parent());

...

void go2(Parent p1){
    Child c2 = (Child)p1;
}

编译器允许您将 p1 从“父”转换为“子”,因为 p1 可能是“子”。但是,您可以清楚地看到, p1 不是孩子。所以你的代码在编译时没问题,但在运行时会崩溃。

这意味着,您可能在“子”类中定义的所有添加行为都不可用,因为您只有一个“父”类型的实例。

【讨论】:

  • 我想如果一个孩子继承了一个父母,那么父母可以被贬低为孩子吗?那么如何应用向下转换呢?谢谢。
【解决方案3】:

您可以将Child 转换为Parent。由于Child 扩展了ParentChild 的任何实例都是 Parent (但只有额外的东西 可用于Child)。但是,p1Parent。自从Parent 不是Child,您不能将Parent 的实例转换为 Child.

我从google search 中准确复制了类似问题的答案。下次请做好功课并阅读常见问题解答。

【讨论】:

  • 感谢亚当。在我提出这个问题之前,我已经阅读了常见问题解答,我只是希望有人向我解释一下,因为我无法理解向下转换。
【解决方案4】:

由于多态引用,当您将sub-type 对象存储到super-type 引用时,您不能使用特定于sub-type 的方法。但是你可以得到super-type中定义的方法。

为了能够使用子类型方法,您需要将super-type的引用转换为sub-type

Parent p = new Child();
...
...
((Child)p).childMethod();

但这只有在您知道分配给p 的对象实际上是Child 类型时才有可能。否则它会给ClassCastException

【讨论】:

    【解决方案5】:

    Parent 不是Child。也就是说,Parent 确实具有必要的字段,可以将其视为Child 的一个实例,并实现所有Child 特定方法——Child 的契约。想象一下,如果Child 有一个变量childOnly 和一个方法childProcess,并且您尝试在内存中的Parent 对象上调用childProcess。它不可能工作,因此 Java 阻止您将父母视为孩子。

    【讨论】:

      【解决方案6】:

      假设Car 是一个准系统界面

      Merc is a Car (Merc extends Car)
      
      BMW  is a Car (BMW extends Car)
      

      现在

      您可以将 BMW 当作汽车的所有功能,对待它就像 BMW 一样。这样您就可以将 BMW 铸造成汽车,所以 (Car car = (Car)bmw) 是合法的

      如果你拿一辆准系统汽车并试图将其视为宝马,那是不可能的,因为宝马将拥有比准系统汽车多得多的东西。

      所以,

      BMW bmw = (BMW)car 非法

      同样的现实世界概念扩展到面向对象的世界。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-30
        • 1970-01-01
        • 1970-01-01
        • 2017-03-16
        • 1970-01-01
        • 2020-07-28
        • 2017-03-18
        • 1970-01-01
        相关资源
        最近更新 更多