Невозможно использовать родительский тип в качестве переменных и при этом получать дочерние типы. - PullRequest
0 голосов
/ 24 января 2019

Привет, я работаю с java 8.Ниже случай:

У меня есть пустой интерфейс AsyncResponse, как показано ниже:

package com.personal.carrot.core.models;

public interface AsyncResponse {
}

И у меня есть модель APIResponse

package com.personal.carrot.core.models;

import org.codehaus.jackson.annotate.JsonProperty;

public class APIResponse implements AsyncResponse {

    @JsonProperty("numberOfFeatures")
    public Long numberOfFeatures;

}

И, наконец,У меня есть служба, использующая Retrofit2 для ответа API:

public interface APIRepository {
    @POST("MYURL")
    Call<APIResponse> resolveCounts(@Body HashMap<String, String> body);
}

Теперь, когда я вызываю APIRepository, как показано ниже:

Call<AsyncResponse> request = repository.resolveCounts(payload);

Я получаю ошибку:

java: несовместимые типы: retrofit2.Call (com.personal.carrot.core.models.APIResponse) нельзя преобразовать в retrofit2.Call (com.personal.carrot.core.models.AsyncResponse)

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Почему это не работает

Вопреки общему пониманию полиморфизма (что вы здесь и пытаетесь достичь), оно не применимо к генерикам.

List<String> strList = new ArrayList();
List<Object> objectList = strList;

Приведенный выше пример выдаст ошибку компиляции.

Это потому, что если мы разрешим вторую строку успешно, то может возникнуть ситуация, когда впоследствии objectList будет назначен список другого типа (например, List<Integer>). strList теперь будет «поврежден», потому что objectList содержит ту же ссылку, что и strList.

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

Потенциальные решения

В зависимости от того, чего вы здесь пытаетесь достичь, потенциальное решение будет:

Call<APIResponse> request = repository.resolveCounts(payload);

или (а я еще не пробовал):

Call<? extends ASyncResponse> request = repository.resolveCounts(payload);
0 голосов
/ 24 января 2019

Сбой, потому что вы не можете присвоить Call<APIResponse> для Call<AsyncResponse>.Универсальные типы являются инвариантами.

Возможно, вам придется использовать APIResponse в качестве аргумента типа для вашей переменной:

Call<APIResponse> request = repository.resolveCounts(payload);

Это не потому, что вы не можете спроектировать свой код для использования интерфейсаAsyncResponse, но поскольку (я предполагаю здесь) среда использует тип возвращаемого значения для обработки привязок, связанных с типом содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...