import java.util.List; class A<D> { abstract class C<S> { <T extends A> void foo(T.C<Integer> x) { Integer bar = x.bar(); } <T extends A> void foo1(A.C<error descr="Type arguments given on a raw type"><Integer></error> x) { Integer bar = x.bar(); } <T extends A> void foo2(A<String>.C<Integer> x) { Integer bar = x.bar(); } abstract S bar(); } } class A1 { abstract class C<S> { <T extends A1> void foo(T.C<Integer> x) { Integer bar = x.bar(); } <T extends A1> void foo1(A1.C<Integer> x) { Integer bar = x.bar(); } abstract S bar(); } } interface Builder<T> { T build(); } interface Test<D extends Test<D, X>, X> { static interface TestBuilder<D extends Test<D, X>, X> extends Builder<D> {} } interface Algorithm<T, B extends Builder<T>> {} class SelectFromVariableType<X, T extends Test<T, X>> implements Algorithm<T, <error descr="Cannot select from a type parameter">T</error>.TestBuilder<T, X>> { List<T.TestBuilder<T, X>> b; T.TestBuilder<T, X> b1; }