从我的课程扩展到另一个课程

时间:2015-11-04 08:34:41

标签: java

我有一些类PERSONINFO和另一个类

public class LotusUser extends PERSONINFO {

}

在我的代码中,我的变量person的类型为PERSONINFO,我想将其转换为LotusUser

LotusUser lu = (LotusUser) person;

但它有例外失败 java.lang.ClassCastException lotus.PERSONINFO无法强制转换为users.LotusUser。

如何解决此问题?

谢谢。

3 个答案:

答案 0 :(得分:3)

由于LotusUserPERSONINFO的子类,所有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.
}