4

Groovyクラス内からApacheCommonsStringUtils.join()メソッドを呼び出そうとしています。part13つの文字列( 、、、 )part2を連結したいpart3

なぜこれが機能しないのですか?

def path = StringUtils.join([part1, part2, part3]) //1

ただし、次の行は機能します。

def path = StringUtils.join([part1, part2, part3] as String[]) //2

フォローアップの質問。なぜこれが機能するのですか?StringUtils v 2.6を使用しているため、varargsメソッドがありません。groovyは常にメソッドパラメーターを配列に変換しますか?

def path = StringUtils.join(part1, part2, part3)  //3

これは主に好奇心の質問です。昨日別の質問を投稿し、より良い解決策を見つけたので、StringUtilsを使用するつもりはありません。ただし、テクニック#1が機能しないのに、#3が機能する理由を理解したいと思います。

4

1 に答える 1

8

それで、何が起こっているかを示すために、スクリプトを書いて、どのような出力が得られるかを示しましょう。

@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)に一致するため、のみです。他の2つについては、Groovyがメソッド呼び出しに最適なものを選択しています。Object[]

との両方1)3)、同じことをしています。パラメータをとしてラップし、Object[]と同じメソッドを呼び出す2)

3)これは、3つの要素でを取得するので問題ありObject[]ませんが、の場合、1つの要素1)でを取得します。Object[]あなたのList

Listパラメーターで機能させる方法は、次のようにスプレッド演算子を使用することです。

path = StringUtils.join( *[ part1, part2, part3 ] )
println "4) $path"

次に、次のように出力します。

4) onetwothree

予想どおり(リストのすべての要素を個別のパラメーターとして配置し、次にこれらをObject[]例のように3つの要素とともに配置します)3)

于 2012-03-20T15:55:13.130 に答える