Instanceof 不显示接口的编译错误,但 abstract class 会

Instanceof does not show compile error with interface, but with abstract class does

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

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 的评论中,我读到了:

The compiler can never know whether a given type doesn't implement an interface because a potential subclass could implement it.

那么,如果 interface 可行,为什么它不适用于 abstract class?它也应该由其他一些 class 扩展,因为它不能单独存在。有人可以澄清一下吗?

更新 编译消息:

Error:(22, 28) java: incompatible types: C cannot be converted to B

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

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

所以:

D extends C implements B // obviously all fine

D extends B extends C 

不可能。因为 B 已经定义 扩展除 Object 之外的任何东西。当然,这里的 "trick" 是 classes B, C 都是已知的,如前所述:C isn't extending B.

举个例子

class D extends C implements A{}

C c = new D();

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

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