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 的实例撤销它(对象),则无法调用。
我认为标题是不言自明的。 所以假设我有这个代码:
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 的实例撤销它(对象),则无法调用。