Groovy三元条件运算符表达式异常?求技术解释
嘿,这可不是Groovy编译器的Bug哦,背后其实是运算符优先级和Groovy的字符串特性在搞鬼!咱们一步步拆解来看:
核心根源:运算符优先级
Groovy里,字符串拼接的+运算符优先级比三元条件运算符?:更高,这直接导致你的代码执行顺序完全偏离了预期。
字符串场景的诡异输出逻辑
先看你写的字符串代码:
def f = true println 'a' + f?'b':'z' + 'c' // 输出b f = false println 'a' + f?'b':'z' + 'c' // 还是输出b
实际执行顺序是先算'a' + f,再把结果作为三元判断的条件,而不是先执行三元表达式。Groovy会自动把布尔值转成字符串:
- 当
f=true时,'a' + true得到非空字符串'atrue' - 当
f=false时,'a' + false得到非空字符串'afalse'
而Groovy里有个规则:所有非空字符串作为布尔条件时,都会被判定为true(只有空字符串''才是false)。所以不管f是true还是false,三元判断的条件都是true,自然每次都返回'b',而且这个过程没有语法错误,编译器也就不会给出警告。
数字场景报错的原因
再看你的数字版本代码:
def f = true println 1 + f?2:3 + 3 // 报错:Cannot find matching method int#plus(boolean)
同样是+优先级更高,先执行1 + f,但Groovy不支持整数和布尔值的加法运算(没有对应的方法),所以直接抛出错误。这和字符串场景的区别在于:字符串可以和任意类型拼接(Groovy自动转字符串),但数字类型没有这个自动转换的特性。
括号解决问题的原理
括号()在Groovy里优先级最高,加括号后会强制先执行三元表达式:
def f = true println 'a' + (f?'b':'z') + 'c' // 输出abc println 1 + (f?2:3) + 3 // 输出6
这里会先计算f?'b':'z'得到预期的结果,再和前后的字符串/数字拼接,完全符合我们写代码时的逻辑预期。
内容的提问来源于stack exchange,提问作者dilvan




