【问题标题】:When does instanceof return FALSE?instanceof 什么时候返回 FALSE?
【发布时间】:2014-01-22 23:18:36
【问题描述】:

我知道当对象是特定类的实例时 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)

这不会编译,这是有道理的,因为它允许在编译时发现疏忽。但是,instanceof 什么时候返回 false 呢?似乎只有两个选项是 TRUE 和 ERROR。我能想到的唯一例外是:

null instanceof A // returns FALSE

但是按照与上面相同的逻辑,这似乎也应该在编译时被捕获。

我在这里缺少什么? true / error 是唯一实用的选项,还是可以以更有意义的方式实际返回 false,除了将 null 作为参考变量给出?

【问题讨论】:

  • 那是 safaris 拼写检查器。考虑上面的伪代码。 ;)
  • (Object)c instanceof B 将编译。 c instanceof B 无法编译的原因是编译器可以静态确定对 C 的引用永远不能是 B

标签: java instanceof


【解决方案1】:

这是一个评估为 false 的示例:

class A {}
class B extends A {}

A a = new A();
a instanceof B   // false

现场演示:http://ideone.com/cQltqE

【讨论】:

    【解决方案2】:

    除了其他答案:任何时候左侧的表达式或右侧的类型都是接口,那么instanceof 可能为真,因此编译器必须允许它。所以很容易想出错误的例子。

    【讨论】:

      【解决方案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 的继承层次结构中。

      【讨论】:

        【解决方案4】:
        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,并且将打印This is a B。但是在调用myMethod(c) 时,如果此方法的第一个语句中的评估将是 FALSE 并将打印 This is a C

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-05
          • 1970-01-01
          • 2012-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多