【问题标题】:Instanceof does not show compile error with interface, but with abstract class doesInstanceof 不显示带有接口的编译错误,但带有抽象类
【发布时间】:2018-07-02 16:52:45
【问题描述】:

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

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

【问题讨论】:

    标签: java instanceof


    【解决方案1】:

    很简单:C 扩展了 Object。 C 的任何子类都不可能扩展 B。您不能添加 另一个 基类,因为 Java 不支持多重继承。

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

    所以:

    D extends C implements B // obviously all fine
    

    D extends B extends C 
    

    是不可能的。因为 B 已经定义扩展 Object 以外的任何东西。当然,这里的“诀窍”是 B、C 两个类都是已知的,并且如前所述:C 没有扩展 B。

    【讨论】:

    • 除非 class C extends B;在这种情况下,它又是合法的。
    • @ElliottFrisch OP 中的class C 不是这种情况。
    • @ElliottFrisch 在上面的代码示例中,它没有。给了 C!
    • 是的,现在说得通了。谢谢
    【解决方案2】:

    举个例子

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

    编译器可以立即判断c 永远不能引用B 的实例,因为如果一个类扩展C,它也不能扩展B。如上例所示,接口不能这样说。

    【讨论】:

      【解决方案3】:

      这是因为在 java 中创建抽象类的实例是绝对不可能的。 运算符 instanceof 是从类 Object 中调用的,如果没有撤销它的类的实例(对象),则无法调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-31
        • 1970-01-01
        • 2011-06-03
        • 2015-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多