【问题标题】:Groovy "not instanceof" peculiarityGroovy“非实例”特性
【发布时间】:2017-01-23 15:42:15
【问题描述】:

在尝试评估 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 应该如何工作?

【问题讨论】:

    标签: groovy instanceof


    【解决方案1】:

    这是operator precedence的情况...

    ! 出现在instanceof 之前,所以它实际上是在检查:

    (!x) instanceof Integer
    

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

    然后查看布尔值是否是 Integer 实例(不是)

    因此false

    如果您将 ! 放在括号外(如在您的第二个版本中),那么它首先执行 instanceof,然后否定结果,给您期望的答案

    为 Groovy 3+ 编辑

    在 groovy 3 中有一种使用 !instanceof 的新方法:

    return x !instanceof Integer
    

    【讨论】:

    • 老兄,我现在非常爱你(以一种非常柏拉图式的方式;)......来自 PHP 我正在抓挠我的头发为什么这不起作用。
    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2011-01-30
    • 2013-09-08
    • 1970-01-01
    • 2015-03-29
    相关资源
    最近更新 更多