Тип возврата в F-ограниченном полиморфизме Java - PullRequest
0 голосов
/ 22 марта 2019

У меня есть интерфейс:

public interface Message<T extends Message<T>> {
}

У меня есть класс, который реализует этот метод как

public class FulfilmentReleasedDomModel implements Message<FulfilmentReleasedDomModel> {}

И у меня есть этот метод:

private <T extends Message<T>> Mono<T> getDomainModel(ConsumerRecord<String, String> record) {}

Когда я пытаюсь вернуть объект типа Mono<FulfilmentReleaseDomModel> из этого метода, компилятор выдает ошибку и просит меня привести его к (Mono<T>).

У меня такой вопрос, поскольку я ограничен T к extends Message, а FulfilmentReleasedDomModel реализует Message<FulfilmentReleasedDomModel>, зачем мне его приводить к Mono<T>?

1 Ответ

1 голос
/ 22 марта 2019

Распространенным заблуждением о дженериках является то, что вызываемый объект решает, что такое дженерик-тип. Нет, звонящий делает.

Вы, как автор метода, не можете решить, что такое 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) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...