Java中的类转换异常

Java中的类转换异常,java,class,exception,casting,classcastexception,Java,Class,Exception,Casting,Classcastexception,我有一个问题,就是不能给对方上课 要更详细地解释它,请看这张图片 在我的代码中,我执行SkillBase s=new SkillBase()

我有一个问题,就是不能给对方上课

要更详细地解释它,请看这张图片

在我的代码中,我执行
SkillBase s=new SkillBase()Subclass sub=(Subclass)s
我添加了一个小的调试部分,它检查是否是返回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:我添加了一些真实的示例,请看一看。编辑后我理解:)非常感谢,我将重新进行细分!