Распространенным заблуждением о дженериках является то, что вызываемый объект решает, что такое дженерик-тип. Нет, звонящий делает.
Вы, как автор метода, не можете решить, что такое T
. Возвращая Mono<FulfilmentReleasedDomModel>
, вы говорите, что T
должно быть FulfilmentReleasedDomModel
. Но на самом деле, вызывающий ваш метод решит, что такое T
. Они могут объявить тип с именем Foo
, который реализует Message<Foo>
, и сказать, что T
- это Foo
. Вместо этого вам нужно будет вернуть Mono<Foo>
.
Похоже, ваш метод не должен быть универсальным, потому что вызываемый объект решает, какой тип использовать:
private Mono<FulfilmentReleasedDomModel> getDomainModel(ConsumerRecord<String, String> record) {}
В качестве альтернативы, если вы хотите сделать этот метод более гибким, чтобы можно было изменить его реализацию так, чтобы он возвращал что-то другое, не меняя тип возвращаемого значения, вы можете использовать универсальные шаблоны:
private Mono<? extends Message> getDomainModel(ConsumerRecord<String, String> record) {}