Похоже, C
должен быть параметром типа на интерфейсе Container
, например K
.
В общем, если Foo
является супертипом Bar
, Bar
не может добавить дополнительные ограничения к параметрам универсального типа для методов из Foo
. Это просто следует из принципа подстановки Лискова: любой Bar
должен быть в состоянии использоваться для , для чего можно a Foo
.
Ограничение C extends BasicContainer<K>
в параметрах типаиз BasicContainer.setData
, когда Container.setData
имеет только ограничение C extends Container<K>
, особенно нарушает это правило.
Вместо этого вы можете использовать верхнюю границу C
в качестве параметра типа для Container,
и установите для него другое значение в BasicContainer
.
. Это может выглядеть следующим образом:
interface Container<K, C extends Container<K, C>> {
<S extends State<K,C>> C setData(K key, Object val,S state);
}
class BasicContainer<K> implements Container<K, BasicContainer<K>> { ... }
... или, если вы обнаружите, что вам нужны дополнительные генерики,
interface Container<K, C extends Container<K, C>> {
<C2 extends C, S extends State<K,C>> C2 setData(K key, Object val,S state);
}
class BasicContainer<K> implements Container<K, BasicContainer<K>> { ... }
(хотя прямо, вторая версия почти наверняка не то, что вы хотите).