Функция fB
требует SomeInterface<Jsonizer>
или один из ее подтипов. SomeImpl
является подтипом SomeInterface<Template>
, а SomeInterface
является инвариантом по своему параметру generi c, поэтому SomeInterface<Template>
НЕ является подтипом SomeInterface<Jsonizer>
, хотя Template
реализует Jsonizer
.
Если вы хотите, чтобы SomeInterface<Template>
был подтипом SomeInterface<Jsonizer>
, вы должны сделать SomeInterface
ковариантным, но это невозможно, потому что методы в ковариантном классе не могут получить экземпляр этого родового c введите в качестве параметра, и у вас есть метод showMe
, который принимает T
в качестве параметра.
Все это означает, что вам следует перепроектировать архитектуру вашего класса. Например, вы можете разделить ваш SomeInterface
на интерфейсы потребителя и производителя - потребителя с методом showMe
и производителя с методом getOne
, чтобы вы могли сделать производителя ковариантным и потребителем контравариантным и создать различные реализации для конкретных подтипов Jsonizer
как вы пытаетесь в своем коде.