2016-12-01 14 views
2

は、おそらくこれは、すでに何回も頼まれましたが、まだ私の疑問は明らかではない:文字列の可変長引数と文字列配列

:として

public Object getConfig(String... names) { 

と私はそれを呼び出す:

私はこのようなメソッドを持っています

ケース1: configService.getConfig("str1", "str2", "str3"); // it works

ケース2:

String[] names = {"str1","str2","str3"}; // it works 
     configService.getConfig(names); 

CASE3: しかし、私たちは文字列であるGETCONFIG(文字列、文字列[])を渡している... argsを理解として、それが

String[] names = {"str1","str2","str3"}; 
configService.getConfig("randomString",names); 

動作しない、次の試してください私はそれが働くことを期待しました。

なぜわかりませんか?

+3

なのでありません。ケース1またはケース2のどちらかを選択する必要があります。コンパイラはケース3を処理しません。なぜですか?推測すると、それはその重さを運ぶと認識されなかった別のケースだからです。これをサポートしているなら、なぜ 'getConfig(" "、names、" "、names)をサポートしないのですか? –

+1

あなたの "randomString"とあなたの 'String [] names'は2つの異なるオブジェクトですが、メソッドは1つのオブジェクト、つまり文字列を取りますvarargs – DamCx

+1

Varargsはすでに多態性メソッドで問題を引き起こしています。 – biziclop

答えて

1

可変引数には、この構文をコンパイルすることsyntactic sugarです。

しかし、Javaでは、要素と配列の魔法の "連結"がなく、あなたがしようとしている単一の大きな配列を形成しません。


AFAIK 1つのステートメントで作業しようとしていることを簡単にする方法はありません。

1

このメソッドでは、パラメータまたは文字列の配列として配列が必要です。文字列と配列の2つのパラメータを渡そうとしています。

代わりにこれを行います。

String[] names = {"str1","str2","str3"}; 
String[] namesX = new String[names.length+1]; 
for (int i = 0; i < names.length; i++) { 
    namesX[i+1] = names[i]; 
} 
namesX[0] = "randomString"; 
configService.getConfig(namesX); 
1

getConfig(String... names)メソッドのシグネチャがgetConfig(String name, String[] names)からgetConfig(String[] names)、 ではなく、に等しいです。それでおしまい。

オーバーロードされたすべての引数を文字列配列に収集し、元の文字列をgetConfig(String... names)と呼びます。オーバーロードされたgetConfig(String name, String[] names)を追加できます。それはあたかも

myMethod("foo", "bar", "baz"); 

void myMethod(String... args) { 
    // 
} 

myMethod(new String[] {"foo", "bar", "baz"}); 

void myMethod(String[] args) { 
    // 
} 

そして、メソッドのパラメータ型はmyMethod(String[] args)としてコンパイルされているので、あなたは明示的に配列を渡すことができ

+0

これは非常に良い説明ですが、希望の結果を得る方法を説明していません – ItamarG3

+0

すべての引数を文字列配列に収集し、後で元のgetConfig(String ... names)を呼び出すオーバーロードされたgetConfigを追加できます。 – Default71721

+0

あなたは正しいですが、私はそれをあなたの答えに加えるべきだということを意味しました – ItamarG3