abstract class Test { abstract <Tf extends String> Tf foo(Class<Tf> c); abstract <Tf1> Tf1 foo1(Class<Tf1> c); abstract <U> Class<? extends U> bar(Class<U> clazz); abstract <U1> Class<U1> bar1(Class<U1> clazz); { foo(bar(String.class)); foo(bar1(String.class)); foo1(bar(String.class)); foo1(bar1(String.class)); } }