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)