Совместимость с Java 8 - PullRequest
0 голосов
/ 10 июня 2018

У меня есть следующее объявление метода:

public <T extends Serializable,
        Method extends BotApiMethod<T>,
        Callback extends SentCallback<T>>
    void executeAsync(Method method, Callback callback)

Когда я использую его следующим образом:

executeAsync(editMessage, new SentCallback() {

он работает нормально, но показывает предупреждения о безопасности типов.

Но когда я предоставляю универсальный тип для SentCallback, например:

executeAsync(editMessage, new SentCallback<Message>()

, он показывает следующую ошибку компиляции:

Метод executeAsync (Method, Callback) в типе AbsSender не применим для аргументов (EditMessageReplyMarkup, новый SentCallback () {})

Почему я не могу использовать его с new SentCallback<Message>?

1 Ответ

0 голосов
/ 10 июня 2018

Во-первых, давайте посмотрим на предполагаемый тип T: учитывая типы ваших параметров (BotApiMethod<Serializable> и SentCallback<Message>), T следует выводить либо на Serializable, либо на Message,Но в то же время текущая реализация требует, чтобы оба параметра имели одинаковую T.Вот почему ваша текущая попытка не работает.Имейте в виду, что в Java, дженерики инвариантны .

Если вы не можете изменить данное определение executeAsync(...), ваша проблема не будет решена с указанными вами параметрами.

Если параметр T является существенным и проект допускает различные общие параметры Method и Callback, которые должны иметь только общий супертип T, определение executeAsync(...) можно изменить на:

public <T extends Serializable,
        Method extends BotApiMethod<? extends T>,
        Callback extends SentCallback<? extends T>>
    void executeAsync(Method method, Callback callback)

Если параметр T не является обязательным, его можно полностью удалить, что приведет к следующему определению executeAsync(...):

public <Method extends BotApiMethod<? extends Serializable>,
        Callback extends SentCallback<? extends Serializable>>
    void executeAsync(Method method, Callback callback)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...