我上了一堂PERSONINFO,另一堂课

public class LotusUser extends PERSONINFO {

}

在我的代码中,我具有类型person的变量PERSONINFO,我想将其转换为LotusUser:
LotusUser lu = (LotusUser) person;

却失败了
无法将java.lang.ClassCastException lotus.PERSONINFO强制转换为users.LotusUser。

如何解决这个问题?

谢谢。

最佳答案

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

您可以通过仅尝试将PERSONINFO引用转换为知道实际上是LotusUser的对象的LotusUser引用(您可以使用instanceof进行检查,但是最好是,如果该知识来自代码的逻辑,则更好),或者通过编写您的代码,使您根本不需要进行强制转换。当您用尽其他选项时,投射是最后的选择。 (可悲的是,尽管这是最后的手段,但是您确实会经常出现在那儿,尽管现代Java具有泛型,并且很多都比Java更好。)

09-27 17:12