[英]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
。
用现实世界来思考:因为每只狗都是动物* ,所以您总是可以将Dog
为Animal
* ,但是由于某些动物不是狗,因此将Animal
为Dog
可能会失败。
*实际上,编译器会为您执行此操作,这被称为多态
您只能向上广播,即将子类分配给超类引用。 这样考虑: Subclass
Superclass
通过添加新方法f()
扩展了Superclass
。 现在, Superclass
对f()一无所知,因此也不知道问题所在。
您可能使用了instanceof
错误。
由于SkillBase
不是Subclass
,因此运行时很容易崩溃。
反之亦然。
s不能转换为Subclass,因为它没有实例化为Subclass。 这是一个技能库。 如果要使用子类,为什么不实例化它?
Subclass s = new Subclass();
您仍然可以设置所需的参数,因为它们已由Skillbase继承,并且不再需要强制转换。
问题是您没有正确使用投射。 始终可以将一个类强制转换为其父类,但反之则不能。 概念是子类(按定义)知道父级的结构,并且(按定义)已经支持父级中的所有签名。 因此,父母是孩子的子集。
但是,反事实并非如此。 父类对子类一无所知,并且/或者子代是否对其结构添加了额外的签名。 因此,没有办法告诉编译器将父级视为子级,并使子级在父级中拥有的所有方法可用。
通俗地说,水(孩子)是液体(父母),但并非所有液体都是水。 因此,您要在液体上进行的任何测量(即:数量,粘度等)也适用于水,但反之亦然(例如:水的密度与油的密度完全不同)。
因此,为了使这一切回到您的情况,您可以将Subclass
为Skillbase
不行。
Subclass instanceof Skillbase == true
(Skillbase) new Subclass() - also valid
(SKillbase) new Sub#2 - also valid
等等...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.