内部类的Java实例无法转换错误

时间:2018-02-02 21:11:15

标签: java casting inner-classes instanceof

我正在使用Java并尝试使用'instanceof'来确定返回的对象是否是类中的实例。我必须使用的代码(不是我的代码)以这种方式布局。问题是为什么instanceof无法正确转换以确定该对象是否是该类的实例?

public class MainClass{
    public static void main(String[] args){
        Class1 myClass1 = new Class1();
        if(myClass1.getObject() instanceof Class1){}  ///<--- Cast Error
    }
}


public class Class1 extends ObjectClass{

    public InnerClass1 getObject(){
        return (InnerClass1)object;
    }

    public static abstract class InnerClass1 extends Class2{}
}


public class Class2 {}


public class ObjectClass {
    final Class2 object = new Class2();
}

正如您所看到的,该对象是Class2的一个实例。当调用'get'方法时,它会将对象强制转换为类型InnerClass1,它扩展了Class2。 InnerClass1是Class1的子类。 'instanceof'检查想要检查对象是否是Class1的实例,但它失败并且无法转换错误。为什么是这样?谢谢你的帮助。

--- --- EDIT 提醒一下,这不是我的代码。我得到了这个与之合作,并且在解析为什么instanceof不起作用时遇到了一些困难。答案很棒,我现在明白了。谢谢!

1 个答案:

答案 0 :(得分:1)

  

InnerClass1是Class1

的子类

没有InnerClass1 extends Class2没有Class1Class2也没有扩展任何类,因此它不能是Class1的显式或隐式子类型意味着以上报价不正确。

无论如何

myClass1.getObject() instanceof Class1 

您正在检查myClass1.getObject()的结果是Class1的子类型。

但编译器知道getObject()被声明为

public InnerClass1 getObject(){..} 

所以它必须返回InnerClass1或其子类型的实例。但由于InnerClass1Class1不是相关的,并且它们不具有共同的祖先或普通的子代(Java中没有类的多重继承,所以任何子类都可以只有一个父类)不可能有InnerClass1(或其子类型)的实例,它也是Class1类型。

因为这样的实例不存在(我这里不包括null)编译器不允许你根据假设这样的实例存在来编写代码。