6

可変アリティ (vararg) メソッドを呼び出すときの動作を説明する Java 言語仕様 (JLS) の関連部分を探しています。

次の方法を検討してください。

public static void printVarArgs(String... args) {
    System.out.println(Arrays.toString(args));
}

メソッドを次のように呼び出すと、次のようになります。

printVarArgs();

出力は次のようになります。呼び出しサイトで[]の省略がメソッドargsで空の配列に変換されているためです。printVarArgs

この動作を定義する JLS のポイントを探しています。私が見つけた最も近いものは15.12.4.2 Evaluate Argumentsですが、この例は示されておらず、このケースが実際に形式的/数学的な説明でカバーされているかどうかはわかりません。

vararg が省略された場合の空の配列の自動作成について説明している JLS の部分はどれですか?

4

2 に答える 2

5

JLS 15.12.4.2から:

mの最後の仮パラメータは必然的にいくつかのTに対してタイプT[]を持ち、mは必然的にk>=0の実際の引数式で呼び出されます。

それは、呼び出し先の観点からです。発信者の観点から、あなたが引用する行動がどこに記載されているかはわかりませんが、それは一種の暗示です。

于 2012-06-05T22:38:08.983 に答える
5

その JLS セクションのテキストには次のように書かれています。

呼び出されるメソッドが可変アリティ メソッド (§8.4.1)mである場合、必ずn > 0仮パラメーターが必要です。の最後の仮パラメーターは、必ずsomeのm型を持ち、 m は必ず実引数式で呼び出されます。T[]Tk >= 0

m が kn 実引数式で呼び出されている場合、または m がk != n実引数式で呼び出されており、k 番目の引数式の型が と互換性のある代入でないT[]場合、引数リスト(e1, ... , en-1, en, ...ek)は として記述されているかのように評価され(e1, ..., en-1, new T[]{en, ..., ek})ます。

あなたが話している場合、k == n - 1形式的な引数があるためen, ..., ek、空のシーケンスがあります。つまり、引数は であるかのように評価され(e1, ..., en-1, new T[]{})ます。

言い換えれば、あなたが見ていたセクションで動作が指定されています。

于 2012-06-05T22:55:57.670 に答える