( BaT | 2014. 10. 17., p – 03:23 )

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? :)