2012-01-27 44 views
0

我在将类之间相互转换时遇到问题。Java中的类抛出异常

要更详细地解释它,请查看此图像。

The Image

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

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

我已经尝试了谷歌,看到了这里的一些问题藏汉和阅读它们(他们都没有说是为我一个答案)

那么,我该怎么办?

回答

5

SkillBase不是Subclass的实例,那么为什么你认为铸造将会起作用?试试这个:

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

这将成功。此外,我认为你是不正确的用instanceof,我确信:

s instanceof Subclass 

产生在上面的代码truefalse你的情况。

在现实世界中来思考:你总是可以投DogAnimal因为每只狗是动物*,但铸造因为有些动物不是狗AnimalDog可能会失败。

*事实上,编译器会为你,它被称为多态性

+0

其实,这就是我正在做的。 Subclass扩展了SkillBase,所以它应该可以被施放吗? – Lolmewn 2012-01-27 19:02:50

+0

要添加:'Subclass' *是一个*'SkillBase'。相反的是**不是**。您不能将父类转换为子类。 – 2012-01-27 19:04:12

+0

@Lolmewn:我添加了一些真实的例子,看看。 – 2012-01-27 19:07:20

0

您只能向上投射,即将子类分配给超类参考。这样想:Subclass通过添加新方法f()扩展了Superclass。现在Superclass不知道关于f()的任何事情,因此问题。

0

您可能正在使用instanceof错误。

由于SkillBase不是Subclass,因此运行系统正常崩溃。

其他的解决方法是正确的。

+0

哦,我明白了。谢谢,现在找到解决方法.. – Lolmewn 2012-01-27 19:04:01

0

s不能被强制转换为子类,因为它不是实例化为子类。这是一个技能基地。如果你想使用一个子类,为什么不实例化呢?

Subclass s = new Subclass(); 

,您仍然可以设置你想要,因为他们通过野兔继承Skillbase和演员不再是必要的参数。

+0

因为我在for循环中,并且在执行其他操作之前必须检查我正在查看的内容,但是如果其他内容失败,这看起来是个不错的选择。 – Lolmewn 2012-01-27 19:01:50

0

问题是您没有正确使用投射。一个类总是可以作为它的父类而不是其他方式。其概念是,一个子类(根据定义)知道父类的结构,并且(根据定义)已经支持父类中的所有签名。因此,父母是孩子的一个子集。

然而,反过来却是不正确的。父类不了解子类和/或孩子是否为其结构添加了额外的签名。因此,无法告诉编译器将父对象看作是一个子对象,并提供该对象在父对象中拥有的所有方法。外行人说,水(孩子)是一种液体(父母),但并非所有的液体都是水。因此,你想对液体进行的任何测量(即:数量,粘度等)对于水也适用,但不能反过来(例如:水的密度与油的密度完全不同)。

所以为了让这一切都回到你的情况,你可以投Subclass作为Skillbase但不是相反。

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

等等