1

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

class DemoStatic {
    public static Runnable testStatic() {
        return () -> {
            System.out.println("Run");
        };
    }

    public void runTest () {
        Runnable r = DemoStatic::testStatic;
        r.run();
    }
}

public class MethodReferenceDemo {
    public static void main(String[] args) {
        DemoStatic demo = new DemoStatic();
        demo.runTest();
    }
}

run()メソッドRunnableによって返されているインスタンスのtestStaticメソッドが呼び出されるはずでした。コンソールの出力は「実行」である必要があります。

しかし、このコードはrun()インスタンスのメソッドを呼び出しておらずr、コンソールに何も出力されていません。

どなたか理由を教えてください。

メソッド参照 "::" を適切に使用していない場合はコメントしてください。

4

2 に答える 2

5

これ

Runnable r = DemoStatic::testStatic;

Runnableメソッドの本体をrun()含むメソッドtestStatic()、つまりを返します。

public static Runnable testStatic() {
    return () -> {
        System.out.println("Run");
    };
}   

それで

r.run();

基本的に実行します

return () -> {
    System.out.println("Run");
};

値を落としreturnます。

static メソッドリファレンスです。Runnable機能的インターフェースが定義するメソッド内のメソッドを参照して実行していることを意味するメソッド参照。


あなたが望む行動のために、あなたはしなければなりません

Runnable r = testStatic();
于 2014-04-11T21:34:53.020 に答える
5

Sotiriosの答えを少し拡張するには:

この文:

Runnable r = DemoStatic::testStatic;

と同等です

Runnable r = new Runnable() {
    @Override
    public void run() {
        DemoStatic.testStatic();
    }
}

そのため、 newを返すためにr.run()呼び出すメソッドを呼び出しますが、その後は何もしません。 testStatic() Runnable

于 2014-04-11T21:40:31.223 に答える