我发现了我在Groovy 2.4.7,1.6.0JVM中没有预料到的行为,当我试图评估一个非实例的情况时。
总结如下:
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)
}
}这个问题是学术性的,但出于好奇:这是语言上的一个缺陷,还是我误解了实例应该如何工作?
发布于 2017-01-23 16:45:46
这是运算符优先的案子..。
!发生在instanceof之前,因此它实际上是在检查:
(!x) instanceof Integer因此,它将字符串转换为布尔值(!'Hello'是false,因为字符串包含一些文本。
然后查看布尔值是否是Integer的实例(但它不是)
因此false
如果将!放在括号外(就像在第二个版本中那样),那么它会执行第一个实例,并否定结果,给出您期望的答案。
编辑Groovy 3+
在groovy 3中,有一种使用!instanceof的新方法
return x !instanceof Integerhttps://stackoverflow.com/questions/41810151
复制相似问题