Groovy展开运算符作为闭包参数失效问题及语法差异咨询
两种Groovy写法的差异解析
第一种写法报错的原因
当你写closureTwoParameter *list时,Groovy会按照运算符优先级将*识别为乘法运算符,对应调用对象的multiply()方法。代码会被解析成:
closureTwoParameter.multiply(list)
但Groovy闭包并没有定义multiply()方法,因此抛出MissingMethodException,提示找不到匹配的multiply()方法签名。
第二种写法正常运行的原因
closureTwoParameter (*list)里的*是展开运算符(Spread Operator),作用是将集合(这里是列表[1,2])的元素逐个拆解,作为独立参数传递给闭包调用。这段代码等价于:
closureTwoParameter(1, 2)
你的闭包定义了两个参数int i, j=1,列表的两个元素刚好匹配参数列表(i=1,j=2),因此闭包能正常执行,打印出3。
核心区别
closureTwoParameter *list:*被当作乘法运算符,尝试调用闭包的multiply方法,属于运算符调用逻辑closureTwoParameter (*list):*作为展开运算符,拆解集合元素为独立参数,属于闭包调用的参数展开逻辑
内容的提问来源于stack exchange,提问作者king
相关产品推荐
相关产品推荐

