我上了一堂PERSONINFO,另一堂课
public class LotusUser extends PERSONINFO {
}
在我的代码中,我具有类型
person
的变量PERSONINFO
,我想将其转换为LotusUser
:LotusUser lu = (LotusUser) person;
却失败了
无法将java.lang.ClassCastException lotus.PERSONINFO强制转换为users.LotusUser。
如何解决这个问题?
谢谢。
最佳答案
因为LotusUser
是PERSONINFO
的子类,所以所有LotusUser
实例也是PERSONINFO
实例,但是不是,所有PERSONINFO
实例都是LotusUser
实例。 (就像所有猫都是动物,但并非所有动物都是猫一样。)它们可能只是PERSONINFO
,也可能是GlarbleThorp
(我刚刚创建的PERSONINFO
的另一个子类)。因此,在一般情况下,除非您知道所拥有的PERSONINFO
实际上是LotusUser
(或LotusUser
子类),否则您无法将对该实例的引用转换为LotusUser
,因为它可能不是一个。
您可以通过仅尝试将PERSONINFO
引用转换为知道实际上是LotusUser
的对象的LotusUser
引用(您可以使用instanceof
进行检查,但是最好是,如果该知识来自代码的逻辑,则更好),或者通过编写您的代码,使您根本不需要进行强制转换。当您用尽其他选项时,投射是最后的选择。 (可悲的是,尽管这是最后的手段,但是您确实会经常出现在那儿,尽管现代Java具有泛型,并且很多都比Java更好。)