class A1<T> {} class B1<T extends A1<? super A1<? super T>>>{ { T a = null; <error descr="Incompatible types. Found: 'T', required: 'A1<? super T>'">A1<? super T> b = a;</error> } } class A<T> {} class B<T extends A<? super A<? super T>>> { void bar(T x){ foo(x); } void foo(A<? super T> x){} void foo(Object x){} }