Ez nem tudom miért olyan meglepő, ha simán meghívnád a Foo-t akkor is az overridden futna B esetén. Igaz nem tudom a delegate-ekből milyen CLR kód fordul, java 8-ban elég egyértelmű:
class A {
public final Runnable f = this::execute;
public void execute() {
System.out.println("A");
}
}
class B extends A {
@Override
public void execute() {
System.out.println("B");
}
}
public class Main {
public static void main(String args[]) {
new A().f.run(); // A
new B().f.run(); // B
}
}
Az f sorából ez lesz:
public final Runnable f = new Runnable() {
@Override
public void run() {
execute();
}
};
Akartam adni linket futó kódra, de sajnos amit találtam java8 környezetet az nem igazán akar működni... :(
Szerk: amúgy most tűnt fel, hogy nálam simán futott ez úgy, hogy egy .java fileban volt ez a kód, pont ahogy ide bemásoltam. Google nélkül ki tudja, miért? :)