web-dev-qa-db-ja.com

Java配列引数宣言構文 "..."はどのように機能しますか?

私はJavaをしばらくの間書いていましたが、今日私は次の宣言に遭遇しました:

public static void main(String... args) {

}

通常の角かっこ[]ではなく、配列宣言の「ドットドットドット」に注意してください。明らかに動作します。実際、私は小さなテストを書き、それが機能することを確認しました。そこで、Java文法を引いて、この引数宣言の構文がどこにあるかを確認しましたが、何も見つかりませんでした。

そこの専門家にとって、これはどのように機能するのでしょうか?それは文法の一部ですか?また、このような関数を宣言することはできますが、このような関数の本体内で配列を宣言することはできません。

とにかく、これが文書化されている場所を知っていますか。それは好奇心であり、おそらく投資する価値はありませんが、私は困惑しました。

49
Virtually Real

Java言語仕様、第3版、第8章(クラス) をご覧ください。このナゲットに埋もれています:

最後の仮パラメーターがT型の可変アリティパラメーターである場合、T []型の仮パラメーターを定義すると見なされます。このメソッドは可変アリティメソッドです。それ以外の場合、固定アリティメソッドです。可変アリティメソッドの呼び出しには、仮パラメータよりも実際の引数式が含まれる場合があります。可変アリティパラメータの前の仮パラメータに対応しない実際の引数式はすべて評価され、結果は配列に格納され、メソッド呼び出しに渡されます(§15.12.4.2)。

基本的に、メソッド呼び出しの最後のパラメーターはT...を持つことができます。それがある場合、T[]に変換されます。

基本的に、あなたが持っているのは、より伝統的な

String[] args
30
hvgotcodes

これは、Java 1.5。

public static void main(String... args);
main("this", "is", "multiple", "strings");

以下と同じです:

public static void main(String[] args);
main(new String[] {"this", "is", "multiple", "strings"});

http://today.Java.net/article/2004/04/13/Java-tech-using-variable-argumentshttp://download.Oracle.com/javase/ 1.5.0/docs/guide/language/varargs.html

35
JohnS

varargs

簡単に言えば、ArrayMember

_public setMembers(Member[] members);
_

使用する場合:

一般に、APIの設計中に、引数の数が固定されていない場合に使用するとよいでしょう。

この標準APIの例は String.format(String format,Object... args) です

も参照してください

22
Jigar Joshi

これは可変引数と呼ばれます。ここをチェックしてください:

公式ドキュメント(Java 1.5)は次のとおりです。

8
icyrock.com

それは、いわゆる可変引数構文です。メソッド本体では、membersパラメーターを配列であるように読み取ることができます。実際には、/ is/'just'配列です。

ただし、魔法のビットはメソッドの呼び出しにあります。 varargs構文が導入される前に、次のようにメソッドを呼び出します。

setMembers(new Members[] {member1, member2, member3});

ただし、新しいvarargs構文を使用すると、配列を明示的に作成する必要がなくなり、次を渡すことができます。

setMembers(member1, member2, member3);

ただし、これはvarargs引数がメソッドの最後の引数でなければならないことを意味します。したがって、次のようなものは許可されていません。

void setMembers(Member ... members, String memberType);

要約:少し構文上の砂糖です。私はJavaコンパイラの内部動作については専門家ではありませんが、varargsパラメーターを受け入れるメソッドを呼び出すメソッドは、ビルドするメソッドに再構築されると確信しています。指定されたタイプの配列。

6
fwielstra
4
Justin Niessner

これは、可変引数と呼ばれます:必要な数(ゼロを含む)の引数を取る関数。たとえば、mainがmain("string1", "string2", "string3")として宣言されている場合、main({"string1", "string2", "string3"})void main(String...args)と同じです。

http://www.Java-tips.org/blog/Java-se/varargs-%E2%80%93-Java-50-addition.html を参照してください

3
Ming-Tang

つまり、0個以上のMemberオブジェクトをsetMembers()メソッドに渡すことができます。 setMembersメソッドでは、membersに配列のセマンティクスがあります。

3
Brian Topping

変数の引数 。 0個以上の文字列引数を持つことができます。

関数は、ストリングの配列としてパラメーターにアクセスできます。

2
Jan Zyka

これは、メソッドが可変数のストリング引数を受け入れることを意味します。引数は配列として扱われるため、添字によって、渡された順序でアクセスされます。

0
dj18