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 } }