对于下面的代码,
package java_instanceof;
/*
*
* Object I0
* I1 I2 ^ \ . ^
* . . | \ . |
* . . | \ ______ . |
* . . C1 |__B___| I3
* . . / .
* .. / .
* C2 .
* ^ .
* | .
* | .
* | .
* C3
*
*/
interface I0{}; interface I1{}; interface I2 {};
interface I3 extends I0{};
class C1{}; class B implements I0{};
class C2 extends C1 implements I1, I2 {}
class C3 extends C2 implements I3 {}
public class Example {
public static void main(String[] args) {
Object o; Object[] oa;
I0 i0; I0[] i0a;
I1 i1; I1[] i1a;
I2 i2; I2[] i2a;
I3 i3; I3[] i3a;
C1 c1; C1[] c1a;
C2 c2; C2[] c2a;
C3 c3; C3[] c3a;
B b; B[] ba;
//Compile time check
boolean value1 = c3 instanceof B; //compile time check error
boolean value2 = b instanceof C3; // compile time check error
}
}
作为初学者,我想知道,javac
如何能够引发编译时错误不兼容的条件操作数类型
?完整的类层次结构在编译时是否已知?
最佳答案
是和否。当然,编译文件及其导入的文件中所有类和接口(interface)的类层次结构在编译时都是已知的。但是,在运行时可能会有其他类和接口(interface)。
但是,在您的情况下,C3
和 B
都是类,然后可用信息足以确定 c3
永远无法引用到 B
的实例,并且 b
永远不能引用 C3
的实例。出现这种情况是因为类继承自单个(或者,对于 Object
而言,没有)父类(super class)。
对于接口(interface),情况有所不同。以下片段不会导致编译时错误:
I1 i1 = ... ;
boolean v = i1 instanceof B;
因为有人可能声明 B
的子类,它也实现 I1
。
关于java - 使用instanceof进行编译时检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31558052/