java – ‘instanceof’操作符对于接口和类的行为不同

我想知道关于以下在Java中instanceof操作的行为。

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
    }
}

为什么会这样?接口C和类B之间没有关系,但它给出false,而在obj instanceof A的情况下它给出编译器错误?

因为Java没有多类继承,所以在编译期间绝对知道类型B的obj对象不能是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  
    }
}

所以只看obj instanceof C表达式编译器不能提前告诉它是真还是假,但是查看obj instanceof A它知道这总是false,因此无意义,并帮助您防止错误。如果你仍然想在你的程序中有这个无意义的检查,你可以添加一个显式转换到对象:

System.out.println(((Object)obj) instanceof A);      //compiles fine
http://stackoverflow.com/questions/31398444/the-instanceof-operator-behaves-differently-for-interfaces-and-classes

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – ‘instanceof’操作符对于接口和类的行为不同