instanceof何时返回FALSE?

时间:2014-01-22 23:18:36

标签: java instanceof

我知道当对象是特定类的实例时,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作为引用变量给出?

4 个答案:

答案 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