7

メソッド参照の構文を理解するのに苦労しています。ここで、2 つのパラメーターabがあり、参照はaonのメソッドへのものbです。

たとえば、私は方法を理解しています

Arrays.sort(personArray, comparators::compareByName);

と同等です

Arrays.sort(personArray, (o1, o2) -> comparators.compareByName(o1, o2));

その場合、ラムダ パラメータはメソッド呼び出しパラメータと一致するため(o1, o2)です。

ただし、このラムダの場合

stream.sorted((o1, o2) -> o1.compareToIgnoreCase(o2));

私のIDEは、次と同等であると教えてくれます:

stream.sorted(String::compareToIgnoreCase);

a.method(b)そして、その構文をメソッド参照に置き換える規則を見つけていません。

たとえば、ラムダに 3 つ以上のパラメーターがある場合はどうなるでしょうか。それは合法ですか?最初のパラメータがメソッドの対象になり、残りがパラメータになりますか?

4

2 に答える 2

7

以下を含むJLS セクション 15.13.3を探していると思います。

形式が の場合、ReferenceType :: [TypeArguments] Identifier呼び出しメソッドの本体は、同様に、メソッド参照式のコンパイル時宣言であるコンパイル時宣言のメソッド呼び出し式の効果を持ちます。メソッド呼び出し式の実行時評価は、§15.12.4.3、§15.12.4.4、および §15.12.4.5 で指定されているとおりです。

  • 呼び出しモードは、§15.12.3 で指定されているコンパイル時の宣言から派生します。

  • コンパイル時の宣言がインスタンス メソッドの場合、ターゲット参照は呼び出しメソッドの最初の仮パラメーターです。それ以外の場合、ターゲット参照はありません。

  • コンパイル時の宣言がインスタンス メソッドの場合、メソッド呼び出し式への引数 (存在する場合) は、呼び出しメソッドの 2 番目以降の仮パラメーターです。それ以外の場合、メソッド呼び出し式への引数は、呼び出しメソッドの仮パラメーターです。

基本的に、最後の 2 つの箇条書きに注意してください。

たとえば、ラムダに 3 つ以上のパラメーターがある場合はどうなるでしょうか。それは合法ですか?最初のパラメータがメソッドの対象になり、残りがパラメータになりますか?

うん :)

于 2014-08-26T18:20:57.380 に答える