Ответы interface Bar<T extends Bar<T>>
уже здесь верны, но я просто хотел добавить, что если это действительно то, что вы хотите применить, возможно, вы захотите взглянуть на составление своих объектов, а не на использование наследования. Не зная слишком много о ваших классах, он может выглядеть примерно так:
public interface FooGetter<T> {
List<? extends T> getFoo();
}
public class FooComposer<T extends Bar> {
...
final T bar;
final FooGetter<T> barGetter;
}
Или это может выглядеть совсем по-другому ... но главное в том, что если вы хотите, чтобы два Ts совпали, композиция может быть ответом.
Конечно, даже это можно обойти, используя необработанные типы ... но, опять же, если кто-то это делает, они просто используют необработанные List
, и когда они получают исключения ClassCastException, вы можете безопасно их ударить. :)