You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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)。所以不管ftrue还是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

火山引擎 最新活动