Instanceof不会显示带有接口的编译错误,但是带有抽象类会显示

Sch*_*uca 2 java instanceof

我认为标题是不言自明的。因此,假设我有以下代码:

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
Run Code Online (Sandbox Code Playgroud)

这个问题的评论中,我读到:

编译器永远无法知道给定类型是否未实现接口,因为潜在的子类可以实现该接口。

因此,如果interface此方法有效,为什么它不应该适用abstract class?它也应该由其他类进行扩展,因为它本身不能存在。有人可以澄清吗?

更新 编译消息:

错误:(22、28)Java:不兼容的类型:C无法转换为B

Gho*_*ica 5

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

而C的子类可以很好地实现该附加接口。但是根本无法将C对象也变成B实例。

所以:

D extends C implements B // obviously all fine
Run Code Online (Sandbox Code Playgroud)

D extends B extends C 
Run Code Online (Sandbox Code Playgroud)

是不可能的。因为B 已经定义为除了Object之外扩展任何东西。当然,这里的“技巧”是,类B,C都是已知的,并且如前所述:C不是扩展B。

  • @ElliottFrisch在上面的代码示例中,事实并非如此。C给定! (3认同)