2

私たちが持っていると言う

class A {
   B method1 (C c) { ... }
}

メソッド参照としての method1 の型は何ですか?

foo()これは、この呼び出しのメソッド シグネチャは何ですか?:

foo (A::method1);

ノート:

インターフェイスを定義しました

interface I {
   B m (A a, C c);
}

そして、 foo を次のように宣言するのが正しいようです

void foo (I i) { }

(呼び出しfoo(A::method1) --insideと一致するため、 meanfooと書く必要があります)。b=i.m(a,c)b=a.method1(c)

これが唯一の方法ですか?

4

4 に答える 4

3

メソッド参照とラムダは、 SAM インターフェイスに一致するようにターゲット タイプ化されています。あなたの場合、それはの引数のIタイプであるため、一致する必要があります。foo

于 2015-09-28T22:11:00.237 に答える
1

非公式の説明:

メソッド参照は、一部のラムダの代替構文と考えることができ、ラムダはすべて 1 つ以上の機能的なインターフェースを実装することに注意してください。

そして、ラムダは (現在) いくつかの単一メソッドの匿名クラスをより簡潔な形式で記述する方法であることを思い出してください。したがって、ラムダは常に匿名クラスに還元できます (ただし、常にその逆であるとは限りません)。

そう

foo (A::method1);

になることができる

foo ((c) -> <body>);

これは匿名クラスに減らすことができます:

foo (new Function<B>() {
    <body>
});

Function のサブタイプである無名クラス

したがって、メソッド参照は、それらが表す機能インターフェースの匿名サブタイプであるため、パラメーターの型は、対応する機能インターフェースまたはそのスーパータイプの 1 つでなければなりません。


JLS には、実際には「15.13.2. メソッド参照のタイプ」というタイトルのセクションがありますが、言葉遣いは少しわかりにくいかもしれません。要するに:

メソッド参照は、次のT場合に型として使用できます。

  • T機能的なインターフェースタイプです(セクション9.8)
  • 機能インターフェースの抽象メソッドは、メソッド参照のコンパイル時の型と一致します
  • また:
    • 参照が返されますvoid
    • 参照は、関数インターフェースの対応する型に割り当てることができる型を返します。たとえば、メソッド参照は返すNumber必要があるか、サブタイプが `B foo(Function f) と互換性がある必要があります。
于 2015-09-28T22:13:27.087 に答える
0

ここで、この質問は複雑すぎて、試してみないと答えられないことを認めていますが、あなたの質問を理解しようとしたため、この状況を理解できました-あなたのアプローチは問題ありません。基本的に、ここで次のことを行っています-

  1. 機能インターフェースを実装する匿名クラスを持つための簡略構文を使用します- これは問題ありません。
  2. A::method1-の実装として使用することをコンパイラに知らせますI.m 。これも問題ありません。
  3. は既に存在するためA::method1、ラムダ式の代わりにメソッド参照を使用できます - これも問題ありません。
  4. cメソッド本体の行で行われる実パラメータの受け渡しfoo- b=i.m(a,c). ここで使用される実際のパラメータcは、 に渡される必要がありますA::method1
  5. この構文の Java 8 仕様に従って、指定したオブジェクトと指定しないオブジェクトa任意a.method1のままです。Class::MethodInstance::Method
于 2015-09-28T22:45:34.967 に答える