代码之家  ›  专栏  ›  技术社区  ›  Schidu Luca

InstanceOf不在接口中显示编译错误,但在抽象类中显示编译错误。

  •  2
  • Schidu Luca  · 技术社区  · 8 年前

    我认为这个标题不言自明。 所以假设我有这个代码:

    interface A { }
    
    abstract class B { }
    
    class C { }
    
    C c = new C();
    
    System.out.println(c instanceof A); //fine
    System.out.println(c instanceof B); // compile error
    

    在评论中 the question 我读到:

    编译器永远无法知道给定的类型是否没有实现接口,因为可能的子类可以实现它。

    所以如果为了 interface 这是可行的,为什么它不适用于 abstract class 是吗?它还应该被其他类扩展,因为它不能由它自己存在。有人能解释清楚吗?

    更新 编译消息:

    错误:(22, 28)Java:不兼容类型:C不能转换为B

    3 回复  |  直到 8 年前
        1
  •  4
  •   GhostCat    8 年前

    很简单:C扩展对象。C的子类不能扩展B。不能添加 另一个 基类,因为Java不支持多重继承。

    而C的子类可以很好地实现这个附加接口。 但C对象也不可能是B实例。

    所以:

    D extends C implements B // obviously all fine
    

    鉴于

    D extends B extends C 
    

    是不可能的。因为B是 已定义 扩展对象以外的任何内容。当然,这里的“诀窍”是两个类B和C都是已知的,正如前面所说:C不扩展B。

        2
  •  1
  •   Code-Apprentice    8 年前

    举个例子

    class D extends C implements A{}
    
    C c = new D();
    

    编译器可以立即告诉您 c 无法引用的实例 B 因为如果类扩展 C 它不能延伸 B 也。正如上面的示例所示,接口不能这样说。

        3
  •  0
  •   Shadow OverLoad    8 年前

    这是因为在Java中创建抽象类的实例是绝对不可能的。 从类对象调用了operator instance of,如果没有类的实例撤消了它(object),则无法调用它。