我有一些类PERSONINFO和另一个类
public class LotusUser extends PERSONINFO {
}
在我的代码中,我的变量person
的类型为PERSONINFO
,我想将其转换为LotusUser
:
LotusUser lu = (LotusUser) person;
但它有例外失败 java.lang.ClassCastException lotus.PERSONINFO无法强制转换为users.LotusUser。
如何解决此问题?
谢谢。
答案 0 :(得分:3)
由于LotusUser
是PERSONINFO
的子类,所有LotusUser
个实例也是PERSONINFO
个实例,但不是所有PERSONINFO
实例是LotusUser
个实例。 (就像所有的猫都是动物一样,但并非所有的动物都是猫。)它们可能只是PERSONINFO
,或者它们可能是GlarbleThorp
(我刚刚创建的PERSONINFO
的另一个子类)。因此,在一般情况下,除非您知道PERSONINFO
实际上是LotusUser
(或LotusUser
子类),否则您无法将对该实例的引用转换为{ {1}},因为它可能不是一个。
您只需尝试对知道实际为LotusUser
的对象的PERSONINFO
引用LotusUser
引用即可修复它(您可以使用{{查看} 1}},但如果知识来自代码的逻辑,或者理想情况下,通过编写代码使得您根本不需要进行转换,它会更好。当您用完其他选项时,施放是最后的选择。 (遗憾的是,即使它是最后的手段,你也会相当频繁地结束,尽管具有泛型的现代Java比以前更好<很多。)
答案 1 :(得分:1)
你做不到。您必须明白,即使每个LotusUser实例都是PERSONINFO的实例,PERSONINFO的每个实例都不会自动成为LotusUser的实例。
所以,在你演员之前,你需要检查它是否是:
if ( person instanceof LotusUser){
LotusUser user = (LotusUser)person;
// rest of your code
}
else{
throw new IllegalArgumentException("Invalid type");
}
答案 2 :(得分:0)
问题在于LotusUser
是 PERSONINFO
,但它不会反过来,即PERSONINFO
可能不是LotusUser
。
对于强制转换失败,这意味着无论您提供的PERSONINFO
对象是什么,实际上都不是LotusUser
。它可以是PERSONINFO
类或其他扩展它的类。
您可以使用instanceof
运算符来查看person
类是LotusUser
类的实例,但确实存在缺陷:
if(person instanceof LotusUser) {
LotusUser lu = (LotusUser)person;
}
else {
//Todo when casing fails.
}