我发现在尝试评估 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应该如何工作?
答案 0 :(得分:4)
这是operator precedence ...
的案例 !
发生在instanceof
之前,所以它实际上正在检查:
(!x) instanceof Integer
因此,它将String转换为布尔值(!'Hello'
为false
,因为该字符串包含一些文本。
然后看看布尔值是否是一个Integer的实例(它不是' t)
因此false
如果你将!
放在括号之外(如第二个版本),那么它首先执行instanceof,并取消结果,给出你期望的答案