Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的向下转换抛出ClassCastException_Java_Casting_Downcast - Fatal编程技术网

Java中的向下转换抛出ClassCastException

Java中的向下转换抛出ClassCastException,java,casting,downcast,Java,Casting,Downcast,我不明白为什么贝娄的演员阵容不起作用(直升机h=(直升机)新旋翼机();)并且抛出类型ClassCastException的运行时异常 基类: public class Rotorcraft { protected final int height = 5; protected int fly(){ return height; } } 儿童班: public class Helicopter extends Rotorcraft { pri

我不明白为什么贝娄的演员阵容不起作用(
直升机h=(直升机)新旋翼机();
)并且
抛出
类型
ClassCastException
运行时异常

基类:

public  class Rotorcraft {

protected final int height = 5;
    protected int fly(){
        return height;
    }
}
儿童班:

public class Helicopter extends Rotorcraft {    
    private int height = 10;

    public int fly() {
        return super.height;
    }

    public static final void main(String[] a){
        Helicopter h = (Helicopter) new Rotorcraft();
    }
}

基本问题是,您试图将其转换为一架
直升机
,但实际上并非如此(它是一架
旋翼机
)。强制转换无法更改对象的运行时类

你的意思是简单地写:

Helicopter h = new Helicopter();

A
旋翼机
并不总是直升机
正确,但如果我说:相信我并运行代码,但它在运行时失败。施放后,我想运行直升机上飞行的方法引用。@SocketM“相信我”,编译器做到了。你没有给它举一个直升机的例子,所以演员阵容失败了。你的想法是错误的。正如你所写的,你是说直升机是旋转式飞机,这就是为什么你会得到错误。相反,Rotocraft应该扩展直升机等级。然后是“直升机h=(直升机)新旋翼机();”意志work@SocketM
旋翼机
类型的参考可以指向
直升机
(或空),这就是为什么允许您进行投射。但是如果它指向的是
旋翼机
,而不是
直升机
,你不能简单地假装它是
直升机
,因为
直升机
可能(现在或将来)有
旋翼机
上不存在的方法和字段。如果您想利用多态行为,请将其用作
旋翼机
。直升机h=新直升机()将始终有效。我正在尝试一些多态行为:-)@SocketM:polymorphics不是这样工作的(无论如何,在Java中不是这样)。您不能创建基类的实例,然后假装它是派生类的实例。事实并非如此,演员阵容也无法做到这一点。谢谢@NPE。你能检查一下我的假设吗?附加在我的问题的评论部分