我正在使用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不起作用时遇到了一些困难。答案很棒,我现在明白了。谢谢!
答案 0 :(得分:1)
InnerClass1是Class1
的子类
没有InnerClass1 extends Class2
没有Class1
,Class2
也没有扩展任何类,因此它不能是Class1
的显式或隐式子类型意味着以上报价不正确。
无论如何
myClass1.getObject() instanceof Class1
您正在检查myClass1.getObject()
的结果是Class1
的子类型。
但编译器知道getObject()
被声明为
public InnerClass1 getObject(){..}
所以它必须返回InnerClass1
或其子类型的实例。但由于InnerClass1
和Class1
不是相关的,并且它们不具有共同的祖先或普通的子代(Java中没有类的多重继承,所以任何子类都可以只有一个父类)不可能有InnerClass1
(或其子类型)的实例,它也是Class1
类型。
因为这样的实例不存在(我这里不包括null
)编译器不允许你根据假设这样的实例存在来编写代码。