質問

次のメソッドシグネチャを検討してください:

public fooMethod (Foo[] foos) { /*...*/ }

and

public fooMethod (Foo... foos) { /*...*/ }

説明:前者はFooオブジェクトの配列を引数として取ります- fooMethod(new Foo [] {..})-後者は任意の量の引数を取りますFooと入力し、メソッド内のFoo:sの配列として提示します- fooMethod(fooObject1、fooObject2、etc ... )。

両方が定義されている場合、Javaは適合をスローし、それらは重複したメソッドであると主張します。私はいくつかの探偵の仕事をしました、そして最初の宣言は本当にFooオブジェクトの明示的な配列を必要とし、それがそのメソッドを呼び出す唯一の方法であることがわかりました。 2番目の方法は、実際には任意の量のFoo引数と、Fooオブジェクトの配列の両方を受け入れます。

では、後者の方法の方が柔軟性が高いと思われるため、最初の例を使用する理由はあるのでしょうか、それとも重要な何かを見落としているのでしょうか?

役に立ちましたか?

解決

これらのメソッドは実際には同じです。

この機能はvarargsと呼ばれ、コンパイラ機能です。舞台裏は、以前のバージョンに変換されます。

Object ...を受け入れるメソッドを定義し、Object []!型の1つのパラメーターを送信した場合、落とし穴があります!

他のヒント

変数引数構文の別の制限は、変数引数が最後に宣言されたパラメーターでなければならないということを追加するために、シミの説明に追加したいと思います。したがって、これを行うことはできません。

void myMethod(String... values, int num);

これは、どのメソッドも単一のvarargパラメーターのみを持つことができることを意味します。複数の配列を渡したい場合は、そのうちの1つだけに可変引数を使用できます。

実際には、配列としてではなく、任意の数の個別の値としてargsを処理する場合、可変引数は最適です。 Java5は単純に配列をマッピングするのが最も便利だからです。

良い例は、String.format()です。ここで、可変引数は、最初の引数の形式プレースホルダーと照合されます。

後者はJava 5で導入され、既存のライブラリは徐々にそれをサポートするために作り直されています。前者を使用して、メソッドに2+の入力が必要であることを強調し、さらに...を使用できる場所に制限があることを強調できます。

確かにパフォーマンスの問題やそのようなことは考慮しないので、セマンティクスに帰着します。

メソッドの呼び出し元に、Fooの配列が手元にあることを期待していますか?次に、Foo []バージョンを使用します。可変引数を使用して、「束」を持つ可能性を強調します。配列の代わりにFooの。

varargsの古典的な例は、文字列形式です(C#では、Javaでの呼び出し方法はわからない):

string Format(string formatString, object... args)

ここでは、argsが異なる型であると予想されるため、引数の配列を持つことは非常に普通ではないため、varargsバリアントです。

一方、次のようなもので

string Join(string[] substrings, char concatenationCharacter)

配列の使用は完全に合理的です。

また、複数のarray-parametersと、paramater-listの最後に1つだけのvarargパラメーターを持つことができることに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top