【问题标题】:Java instanceof Inner Class cannot cast errorJava instanceof Inner Class 无法转换错误
【发布时间】:2018-02-02 21:11:14
【问题描述】:

我正在使用 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”方法时,它会将对象转换为扩展 Class2 的 InnerClass1 类型。 InnerClass1 是 Class1 的子类。 “instanceof”检查想要检查对象是否是 Class1 的实例,但它失败并出现无法转换错误。为什么是这样?感谢您的帮助。

---编辑--- 只是提醒一下,这不是我的代码。我得到了这个工作,只是在解析为什么 instanceof 不工作时遇到了一些困难。答案很好,我现在明白了。谢谢!

【问题讨论】:

  • Class2 不是InnerClass1 的子类。
  • 补充@tsolakp 所说的,Class2 首先不是子类。
  • 如果您首先对临时引用执行getObject 方法,例如:Object tempObject = myClass.getObject();,您会看到错误来自何处。尽量不要使您的代码过于复杂,因为它通常会导致您现在遇到的此类误解。

标签: java casting inner-classes instanceof


【解决方案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 此处)编译器不允许您基于此类实例可能存在的假设编写代码。

【讨论】:

猜你喜欢
  • 2019-01-24
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多