'instanceof'运算符对接口和类的行为有所不同

Aja*_*rma 88 java inheritance interface class instanceof

我想知道instanceofJava 中运算符的以下行为.

interface C {}

class B {}

public class A {
    public static void main(String args[]) {
        B obj = new B();
        System.out.println(obj instanceof A);      //Gives compiler error
        System.out.println(obj instanceof C);      //Gives false as output
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?interface C和之间没有关系class B,但是它给出了假,而在obj instanceof A它出现编译错误的情况下?

Tag*_*eev 127

因为Java没有多类继承,所以在编译期间绝对知道obj类型的对象B不能是子类型A.另一方面,它可能是接口的子类型C,例如在这种情况下:

interface C {}

class B {}

class D extends B implements C {}

public class A {
    public static void main(String args[]) {
        B obj = new D();
        System.out.println(obj instanceof C);      //compiles and gives true as output  
    }
}
Run Code Online (Sandbox Code Playgroud)

所以只看obj instanceof C表达式编译器不能事先告诉它是真还是假,但看着obj instanceof A它知道这总是错误的,因此毫无意义并且可以帮助你防止错误.如果您仍希望在程序中进行无意义的检查,则可以向以下内容添加显式强制转换Object:

System.out.println(((Object)obj) instanceof A);      //compiles fine
Run Code Online (Sandbox Code Playgroud)