java - 使用instanceof进行编译时检查

标签 java javac instanceof

对于下面的代码,

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)。

但是,在您的情况下,C3B 都是类,然后可用信息足以确定 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/

相关文章:

java - 在java中解析字符串以获取信息

java - 哪个版本的 spring data mongo db 带有 mongo java driver 3.0.2 和 spring Framework 3.2.2.Release

java - 为什么 Eclipse 会警告 Java "unused variables"但 javac 不会?

java - 如何在cmd行中运行java类文件

javascript instanceOf解释

java - 是否可以在 switch 语句中使用 instanceof 运算符?

java - Java 中的 LSH 库

java - Android Studio 变得非常缓慢并且不断出现 "updating indices"

javac 不显示编译器错误?

Java无法识别该对象属于子类