Итак, чтобы показать, что происходит, давайте напишем скрипт и покажем, какой вывод мы получаем:
@Grab( 'commons-lang:commons-lang:2.6' )
import org.apache.commons.lang.StringUtils
def (part1,part2,part3) = [ 'one', 'two', 'three' ]
def path = StringUtils.join( [ part1, part2, part3 ] )
println "1) $path"
path = StringUtils.join( [ part1, part2, part3 ] as String[] )
println "2) $path"
path = StringUtils.join( part1, part2, part3 )
println "3) $path"
Это печатает:
1) [one, two, three]
2) onetwothree
3) onetwothree
По сути, единственный из ваших вызовов методов, который соответствует сигнатуре в классе StringUtils, - это 2)
, так как он соответствует определению Object[]
. Для двух других Groovy выбирает лучшее соответствие, которое можно найти для вашего вызова метода.
Для 1)
и 3)
он делает одно и то же. Перенос параметров как Object[]
и вызов того же метода, что и 2)
Для 3)
это хорошо, так как вы получаете Object[]
с 3 элементами, но для 1)
вы получаете Object[]
с одним элементом; ваш List
.
Чтобы заставить его работать с параметром List, можно использовать оператор распространения , например, так:
path = StringUtils.join( *[ part1, part2, part3 ] )
println "4) $path"
Который тогда напечатает:
4) onetwothree
Как и ожидалось (все элементы списка будут помещены в отдельные параметры, а затем они будут помещены в Object[]
с тремя элементами, как в примере 3)