我有两个包:控制器和联邦。控制器只包含带有main方法的控制器类,但是联邦包含两个类: Shuttle (父类)和MiniShuttle (子类)。升空就像一种魅力,但是当我试图降级的时候,我得到了ClassCastException。
这是我尝试过的代码:
Shuttle.java
package federation;
public class Shuttle {
protected int passengers;
}MiniShuttle.java
package federation;
public class MiniShuttle extends Shuttle {
}Controller.java
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");
}
}
}发布于 2018-10-22 15:05:48
因为您已经实例化了Shuttle。声明new Shuttle()表示Shuttle类型的对象被实例化,对该对象的引用是Shuttle (来自Shuttle shuttle = ...)。如果您想让它正常工作,请使用Shuttle shuttle = new MiniShuttle()。这样,您实际上是在说“我正在实例化一个MiniShuttle类型的对象,并将其引用到Shuttle类型”。
发布于 2018-10-22 15:10:08
正如您所说的,您是_down_casting,意思是从父级转换到子级--它不会那样工作,因为shuttle是Shuttle类型的,而不是MiniShuttle类型的。
不过,你可以用另一种方式:
MiniShuttle miniShuttle = new MiniShuttle();
Shuttle shuttle = (Shuttle) miniShuttle;那样的话,您就是_up_casting,这是非常好的,因为每个MiniShuttle也是Shuttle。
发布于 2018-10-22 15:09:59
OOPS中的契约是由超类而不是子类定义的。基本上,扩展契约被定义为"is“关系,其中子类是超类的对象,反之亦然
从这个角度看,MiniShuttle是穿梭的,但航天飞机不是MiniShuttle。
https://stackoverflow.com/questions/52932403
复制相似问题