8

次のコードを検討してください。

class Test {

    void accept(Consumer<Integer> c) {}

    static void consumer(Integer i) {}

    void foo() {
        accept(this::consumer); // The method accept(Consumer<Integer>) in the type Test is not applicable for the arguments (this::consumer)
        accept(Test::consumer); // Valid
    }

}

先日、静的メソッドを非静的な方法で誤って呼び出したときに、これに遭遇しました。非静的な方法で静的メソッドを呼び出すべきではないことはわかっていますが、この場合、型を推測できないのはなぜでしょうか?

4

1 に答える 1

4

実際にはエラーは言うinvalid method reference static bound method reference

4 種類のメソッド参照について知っていれば、これは理にかなっています。

  1. 静的メソッドへの参照。
  2. バインドされた非静的メソッドへの参照。
  3. バインドされていない非静的メソッドへの参照。
  4. コンストラクタへの参照

JLSの説明:

メソッド参照式の形式が ReferenceType :: [TypeArguments] Identifier であり、コンパイル時の宣言が静的であり、ReferenceType が単純名または修飾名でない場合、コンパイル時エラーになります。

悪い設計に加えて、受信機をキャプチャ (境界) するためのパフォーマンス オーバーヘッドがあります。

于 2015-05-09T19:27:17.280 に答える