class PreTest<T> { <S extends T> void foo(S s) {} } class Test<T> extends PreTest<T> { void test() { new Test<A>().<A>foo(new A()); new Test<A>().<B>foo(new B()); new Test<A>().foo(new A()); new Test<A>().foo(new B()); } } class Test2 extends Test<A> { void test2() { new Test2().<A>foo(new A()); new Test2().<B>foo(new B()); new Test2().foo(new A()); new Test2().foo(new B()); } } class Test3 extends Test2 { void test3() { new Test3().<A>foo(new A()); new Test3().<B>foo(new B()); new Test3().foo(new A()); new Test3().foo(new B()); } } class A {} class B extends A {}