class B { } class A extends B { } class D { } class C extends D { } class G { void f(A a, D d) { } void f(B b, C c) { } } public class Ambig1 { G g = new G() ; A a = new A() ; C c = new C() ; void x () { g.f(a, c ) ; // ambiguous // B b = new B() ; // g.f(b, c ) ; // OK } }