0

メソッド参照と混同しています。次のスクリプトを検討してください。

public class Main {

    static interface I {
        void m();
    }

    static class A implements I {
        @Override
        public void m() {
            System.out.println("A");
        }
    }

    static class B implements I {
        @Override
        public void m() {
            System.out.println("B");
        }
    }

    public static void main(String[] args) {
        A a = new A(); B b = new B();
        I i; Runnable r;
        i = a;
        r = i::m;  // static reference? might infere class
        r.run(); // prints "A"
        run(i); // also prints "A"
        i = b;
        r.run(); // prints "A" instead of "B"!
        run(i); // prints "B"
        r = i::m;
        r.run(); // now prints "B"
        run(i); // also prints "B"
    }

    public static void run(I i) {
        Runnable r = i::m; // dynamic reference, cannot infere class
        r.run();
    }
}

したがって、次のようです。

  • メソッド参照は多態的であるため、コンパイラはメソッド参照をインライン化できません。それらはコンパイル時には解決されませんが、実行時に解決されます。
  • しかし、次i::mのように動作しませんi.m()...

だから私の質問は:

メソッド参照はリフレクションを使用していますか? そして、なぜ彼らは一度だけするのですか?

4

1 に答える 1