Java中的类转换异常
我有一个问题,就是不能给对方上课 要更详细地解释它,请看这张图片 在我的代码中,我执行Java中的类转换异常,java,class,exception,casting,classcastexception,Java,Class,Exception,Casting,Classcastexception,我有一个问题,就是不能给对方上课 要更详细地解释它,请看这张图片 在我的代码中,我执行SkillBase s=new SkillBase()
SkillBase s=new SkillBase()然后在该类中设置一些值。
然后我尝试做Subclass sub=(Subclass)s但是当运行它时,它会给出一个ClassCastException
我添加了一个小的调试部分,它检查是否是返回true的instanceof
我试过谷歌,在这里也看到了一些问题并阅读了它们(没有一个答案是适合我的)
那么,我该怎么办呢?您只能向上转换,即将子类分配给超类引用。可以这样想:子类
通过添加新方法f()
扩展了超类
。现在,超类
不知道关于f()的任何事情,因此也不知道这个问题 您可能使用了instanceof
错误
运行时很容易崩溃,因为SkillBase
不是子类
另一种说法是正确的。SkillBase
不是子类的实例,那么为什么您认为强制转换会起作用呢?试试这个:
SkillBase s = new Subclass();
Subclass sub = (Subclass)s;
这会成功的。此外,我认为您对
实例的看法不正确,我确信:
s instanceof Subclass
在上述代码中产生true
,但在您的情况下产生false
用现实世界的术语思考:你总是可以将狗
投射到动物
,因为每只狗都是动物*,但将动物
投射到狗
可能会失败,因为有些动物不是狗
*事实上,编译器为您做到了这一点,它被称为多态性,s不能被转换为子类,因为它没有被实例化为子类。这是一个技能基础。如果你想使用一个子类,为什么不直接实例化它呢
Subclass s = new Subclass();
您仍然可以设置所需的参数,因为它们由Skillbase继承,并且不再需要强制转换。问题在于您没有正确使用强制转换。类始终可以强制转换为其父类,但不能反过来转换。概念是子类(根据定义)知道父类的结构,并且(根据定义)已经支持父类中的所有签名。因此,父对象是子对象的子集
然而,事实并非如此。父类不知道子类和/或子类是否向其结构添加了额外的签名。因此,无法告诉编译器将父对象视为子对象,并使子对象在父对象中拥有的所有方法都可用
外行说,水(儿童)是液体(父母),但并非所有液体都是水。因此,你想对液体进行的任何测量(即:数量、粘度等)也适用于水,但不是相反(例如:水的密度与油的密度完全不同)
因此,为了让这一切回到您的情况,您可以将子类
转换为技能库
,但不能反过来
Subclass instanceof Skillbase == true
(Skillbase) new Subclass() - also valid
(SKillbase) new Sub#2 - also valid
等等。因为我在一个for循环中,在做其余的事情之前,我必须检查我正在看的东西,但是如果其他东西失败,这似乎是一个不错的选择。事实上,这就是我正在做的。子类扩展了SkillBase,所以它应该是可强制转换的,对吗?要添加:Subclass
是一个SkillBase
。事实并非如此。您不能将父类强制转换为子类。@Lolmewn:我添加了一些真实的示例,请看一看。编辑后我理解:)非常感谢,我将重新进行细分!