繁体   English   中英

Java中的类转换异常

[英]Class Casting Exception in Java

我在将类彼此转换时遇到问题。

为了更详细地解释它,请看一下这张图片。

图片

在我的代码中,我执行SkillBase s = new SkillBase(); 然后在该类中设置一些值。 然后我尝试做Subclass sub = (Subclass)s; 但是运行时会给出ClassCastException。

我添加了一个小的调试部分,该部分检查它的instanceof是否返回true。

我已经尝试过Google,在这里也看到了一些问题并阅读了它们(没有一个答案适合我)

那么,我该怎么办?

SkillBase不是Subclass的实例,那么您为什么认为强制转换会起作用? 试试这个:

SkillBase s = new Subclass();
Subclass sub = (Subclass)s;

将会成功。 另外我认为您对instanceof并不正确,我可以确定:

s instanceof Subclass

在上面的代码中产生true ,但在您的情况下产生false

用现实世界来思考:因为每只狗都是动物* ,所以您总是可以将DogAnimal * ,但是由于某些动物不是狗,因此将AnimalDog可能会失败。

*实际上,编译器会为您执行此操作,这被称为多态

您只能向上广播,即将子类分配给超类引用。 这样考虑: Subclass Superclass通过添加新方法f()扩展了Superclass 现在, Superclass对f()一无所知,因此也不知道问题所在。

您可能使用了instanceof错误。

由于SkillBase不是Subclass ,因此运行时很容易崩溃。

反之亦然。

s不能转换为Subclass,因为它没有实例化为Subclass。 这是一个技能库。 如果要使用子类,为什么不实例化它?

Subclass s = new Subclass();

您仍然可以设置所需的参数,因为它们已由Skillbase继承,并且不再需要强制转换。

问题是您没有正确使用投射。 始终可以将一个类强制转换为其父类,但反之则不能。 概念是子类(按定义)知道父级的结构,并且(按定义)已经支持父级中的所有签名。 因此,父母是孩子的子集。

但是,反事实并非如此。 父类对子类一无所知,并且/或者子代是否对其结构添加了额外的签名。 因此,没有办法告诉编译器将父级视为子级,并使子级在父级中拥有的所有方法可用。

通俗地说,水(孩子)是液体(父母),但并非所有液体都是水。 因此,您要在液体上进行的任何测量(即:数量,粘度等)也适用于水,但反之亦然(例如:水的密度与油的密度完全不同)。

因此,为了使这一切回到您的情况,您可以将SubclassSkillbase不行。

Subclass instanceof Skillbase == true
(Skillbase) new Subclass() - also valid
(SKillbase) new Sub#2 - also valid

等等...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM