我知道当对象是特定类的实例时,instanceof返回TRUE。例如:
B extends A
C extends A
B b = new B();
C c = new C();
b instanceof A // returns TRUE
到目前为止一切都那么好,所以让我们输入看起来应该返回false的东西:
c instanceof B // won't compile (error: inconvertible types)
这不能编译,这是有道理的,因为它允许在编译时捕获疏忽。但是,当DOES instanceof实际返回false时?似乎只有两个选项是TRUE和ERROR。我能想到的唯一例外是:
null instanceof A // returns FALSE
但是按照与上面相同的逻辑,它似乎应该在编译时捕获。
我在这里缺少什么? true / error是唯一可行的选项,还是可以以更有意义的方式实际返回false,除非将null作为引用变量给出?
答案 0 :(得分:8)
这是一个评估为false的示例:
class A {}
class B extends A {}
A a = new A();
a instanceof B // false
现场演示:http://ideone.com/cQltqE。
答案 1 :(得分:5)
除了其他答案:任何时候左边的表达式或右边的类型都是一个接口,那么instanceof
可能是真的,所以编译器必须允许它。所以很容易想出一些错误的例子。
答案 2 :(得分:3)
这是另一个返回false的示例
public static void main(String[] args) {
checkType("");
}
static <T> void checkType(T sometype) {
System.out.println(sometype instanceof A);
}
static class A {}
在尝试比较(然后转换)为更具体的类型时,它才真正有用。
在您的示例中,
c instanceof A
没有意义,因为类型C
不在A
的继承层次结构中。
答案 3 :(得分:0)
B extends A
C extends A
B b = new B();
C c = new C();
b instanceof A // returns TRUE
myMethod(b); // has TRUE and then FALSE
myMethod(c); // has FALSE and then TRUE
void myMethod(A a){
if(a instanceof B){System.out.println("This is a B");}//first statement
if(a instanceof C){System.out.println("This is a C");}//second statement
}
在致电myMethod(b)
时,如果此方法的第二个陈述中的评价为 FALSE ,则会打印这是B 。但是,在调用myMethod(c)
时,如果此方法的第一个语句中的评估将 FALSE 并且将打印这是C