首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在这种情况下下播会抛出ClassCastException?

为什么在这种情况下下播会抛出ClassCastException?
EN

Stack Overflow用户
提问于 2018-10-22 15:02:24
回答 4查看 218关注 0票数 0

我有两个包:控制器和联邦。控制器只包含带有main方法的控制器类,但是联邦包含两个类: Shuttle (父类)和MiniShuttle (子类)。升空就像一种魅力,但是当我试图降级的时候,我得到了ClassCastException。

这是我尝试过的代码:

Shuttle.java

代码语言:javascript
复制
package federation;

public class Shuttle {

    protected int passengers;

}

MiniShuttle.java

代码语言:javascript
复制
package federation;

public class MiniShuttle extends Shuttle {


}

Controller.java

代码语言:javascript
复制
package controller;

import federation.MiniShuttle;
import federation.Shuttle;

public class Controller {

    public static void main(String[] args) {
        Shuttle shuttle = new Shuttle();
        MiniShuttle mshuttle = (MiniShuttle)shuttle;

        if(mshuttle instanceof Shuttle)
        {
            System.out.println("ok");
        }else
        {
            System.out.println("not ok");
        }

    }

}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-10-22 15:05:48

因为您已经实例化了Shuttle。声明new Shuttle()表示Shuttle类型的对象被实例化,对该对象的引用是Shuttle (来自Shuttle shuttle = ...)。如果您想让它正常工作,请使用Shuttle shuttle = new MiniShuttle()。这样,您实际上是在说“我正在实例化一个MiniShuttle类型的对象,并将其引用到Shuttle类型”。

票数 3
EN

Stack Overflow用户

发布于 2018-10-22 15:10:08

正如您所说的,您是_down_casting,意思是从父级转换到子级--它不会那样工作,因为shuttleShuttle类型的,而不是MiniShuttle类型的。

不过,你可以用另一种方式:

代码语言:javascript
复制
MiniShuttle miniShuttle = new MiniShuttle();
Shuttle shuttle = (Shuttle) miniShuttle;

那样的话,您就是_up_casting,这是非常好的,因为每个MiniShuttle也是Shuttle

票数 2
EN

Stack Overflow用户

发布于 2018-10-22 15:09:59

OOPS中的契约是由超类而不是子类定义的。基本上,扩展契约被定义为"is“关系,其中子类是超类的对象,反之亦然

从这个角度看,MiniShuttle是穿梭的,但航天飞机不是MiniShuttle。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52932403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档