メソッド参照と混同しています。次のスクリプトを検討してください。
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()
...
だから私の質問は:
メソッド参照はリフレクションを使用していますか? そして、なぜ彼らは一度だけするのですか?