4
public class Main {
    interface Capitalizer {
        public String capitalize(String name);
    }

    public String toUpperCase() {
        return "ALLCAPS";
    }

    public static void main(String[] args) {
        Capitalizer c = String::toUpperCase; //This works
        c = Main::toUpperCase; //Compile error
    }
}

どちらも同じシグネチャを持つインスタンス メソッドです。一方が機能し、もう一方が機能しないのはなぜですか?

の署名String::toUpperCase:String toUpperCase();

4

3 に答える 3

6

メソッドを参照するための 3 つの構造があります。

  1. object::instanceMethod
  2. Class::staticMethod
  3. Class::instanceMethod

この線:

Capitalizer c = String::toUpperCase; //This works

3番目の構成を使用 - Class::instanceMethod。この場合、最初のパラメータがメソッドのターゲットになります。この構成は、次の Lambda と同等 (変換) です。

Capitalizer = (String x) -> x.toUpperCase();

この Lambda 式が機能するのは、LambdaStringパラメータとして取得し、結果を返すためです ( interfaceStringの要求に応じて)Capitalizer

この線:

c = Main::toUpperCase; //Compile error

翻訳先:

(Main m) ->  m.toUpperCase();

Capitalizerインターフェイスでは機能しません。これを確認するには、次のように変更Capitalizerします。

interface Capitalizer {
    public String capitalize(Main name);
}

この変更後、Main::toUpperCaseコンパイルされます。

于 2015-05-04T13:15:28.453 に答える