- Имеется класс С
- Имеется интерфейс I
- Нужно написать generic класс с параметром, который одновременно расширяет C и реализует I
class K<T extends C implements I>
приводит к очень невразумительным ошибкам компилятора: он не ругается на эту строку, но при этом считает, что K должен implements I.
А правильный вариант другой:
class K<T extends C & I>
Такой вот любопытный синтаксис. Это описано в разделе Converting Legacy Code to Use Generics. Там же указано, что интерфейсов можно задать сколько угодно:
class K<T extends C & I1 & I2 & ...>