Groovy“不是实例”的特殊性

时间:2017-01-23 15:42:16

标签: groovy instanceof

我发现在尝试评估 not instanceof条件时,我在Groovy 2.4.7,1.6.0 JVM中没有预料到的行为。

摘要:

class Foo {    
    static Boolean bar() {
      String x = "Personally, I don't really like King Crimson"
      return (!x instanceof Integer)
    }    
}

我预计Foo.bar()将返回true,因为x 不是 Integer的实例,但是Foo.bar()返回false。相反,以下内容返回true:

class Foo {    
    static Boolean bar() {
      String x = "Personally, I don't really like King Crimson"
      return !(x instanceof Integer)
    }    
}

问题是学术性的,但出于好奇:这是语言中的错误还是我误解了instanceof应该如何工作?

1 个答案:

答案 0 :(得分:4)

这是operator precedence ...

的案例

!发生在instanceof之前,所以它实际上正在检查:

(!x) instanceof Integer

因此,它将String转换为布尔值(!'Hello'false,因为该字符串包含一些文本。

然后看看布尔值是否是一个Integer的实例(它不是' t)

因此false

如果你将!放在括号之外(如第二个版本),那么它首先执行instanceof,并取消结果,给出你期望的答案