

class A extends B {
   void f(D d) {}
}

class B {
   void f(C c) {}
}

class C extends D { }
class D { }

class G {
   A a = new A() ;
   B b = new B() ;
   C c = new C() ;
   D d = new D() ;

   void g() {
      // a.f(c) ;  // ambiguous
      a.f(d) ;    // OK
   }

}

