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

时间:2018-06-29 19:43:46

标签: 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

the question的评论中,我读到了这一点:

  

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

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

更新 编译消息:

  

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

3 个答案:

答案 0 :(得分:4)

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

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

所以:

D extends C implements B // obviously all fine

D extends B extends C 

是不可能的。因为B已已定义扩展,但对象除外。当然,这里的“窍门”是B,C这两个类都是已知的,并且正如所说的那样:C不是扩展B。

答案 1 :(得分:1)

例如

class D extends C implements A{}

C c = new D();

编译器可以立即告诉c永远不能引用B的实例,因为如果类扩展了C,它也不能扩展B。如上面的示例所示,接口不能如此。

答案 2 :(得分:0)

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