2015-11-04 63 views
0

我有一些类PERSONINFO和其他类铸一类到另一个,从什么扩展我的

public class LotusUser extends PERSONINFO { 

} 

在我的代码具有可变personPERSONINFO类型,我想将它转换为LotusUser

LotusUser lu = (LotusUser) person; 

但它的失败,除了 java.lang.ClassCastException lotus.PERSONINFO不能转换为users.LotusUser。

如何解决这个问题?

谢谢。

+0

我希望你_don't_有'块class'命名帽。 –

回答

3

因为LotusUserPERSONINFO一个子类,所有LotusUser实例也是PERSONINFO实例,但所有PERSONINFO实例都LotusUser实例。 (就像所有的猫都是动物,但不是所有的动物都是猫。)它们可能只是PERSONINFO,或者它们可能是GlarbleThorp(我刚刚创建的另一个子类PERSONINFO)。因此,在一般情况下,除非您知道PERSONINFO实际上是LotusUser(或LotusUser子类),否则不能将对该实例的引用强制转换为LotusUser,因为它可能不是一个。

你只尝试投放PERSONINFO引用LotusUser引用的对象,你知道实际上LotusUser撮合它(你可以用instanceof检查,但如果知识来自于代码的逻辑是更好),或理想情况下,通过编写代码,以便根本不需要进行演员制作。当你用尽其他选项时,投射是最后的选择。 (遗憾的是,尽管这是最后一招,但最终确实会频繁出现,不过现代Java与泛型等比起以前的版本更好一些。)

1

你不能那样做。您必须明白,即使LotusUser的每个实例都是PERSONINFO的实例,但并非每个PERSONINFO实例都自动成为LotusUser的实例。

所以,你需要检查它是否是,你施放前:

if (person instanceof LotusUser){ 
    LotusUser user = (LotusUser)person; 
    // rest of your code 
} 
else{ 
throw new IllegalArgumentException("Invalid type"); 
} 
0

问题是LotusUserPERSONINFO,但它不工作,反过来,也就是,PERSONINFO可能不是LotusUser

对于失败演员,这意味着无论您提供的PERSONINFO对象是什么,它实际上都不是LotusUser。它可能是一个PERSONINFO类或其他扩展它的类。

您可以使用instanceof运营商,看是否personLotusUser类的实例,但也有其缺陷:

if(person instanceof LotusUser) { 
    LotusUser lu = (LotusUser)person; 
} 
else { 
    //Todo when casing fails. 
} 
相关问题