class A { public void foo(T t){} } class B extends A { public void foo(String s) {} } class C extends B {} class D { public void foo(T t){} public void foo(String s) {} } class E extends D {} class F extends D { public void foo(String s) {} }