Реализация универсального интерфейса с универсальным типом в Java - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь реализовать универсальный интерфейс в Java с универсальным типом и получаю ошибки компиляции. Мне интересно, возможно ли следующее:

public class ListResponse<T> {
    private List<T> response;

    public ListResponse(List<T> response) {
        this.response = response;
    }

    public List<T> getResponse() {
        return response;
    }
}

И хлопотный класс:

import java.util.function.Consumer;
import java.util.List;
import com.myorg.response.ListResponse;

public class ListPresenter<T> implements Consumer<ListResponse<T>> {
    private ListResponse<T> response;

    public <T> void accept(ListResponse<T> response) {
        this.response = response;
    }

    // Rest of class
}

Я надеялся получить такой код вызова:

ListPresenter<Integer> presenter = new ListPresenter<>();

Однако я получаю ошибку компиляции со следующим сообщением:

 error: ListPresenter is not abstract and does not override abstract
 method accept(ListResponse<T>) in Consumer [ERROR] where T is a
 type-variable: [ERROR] T extends Object declared in class
 ListPresenter

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Вы переопределяете универсальный параметр <T> для метода accept(...).Механика похожа на скрытие атрибутов через локальные переменные с тем же именем.

T на public <T> void accept(ListResponse<T> response) не «связан» с T на public class ListPresenter<T> implements Consumer<ListResponse<T>>.

Проблема может быть устранена путем удаления первого <T> в объявлении метода accept(...):

public class ListPresenter<T> implements Consumer<ListResponse<T>> {
    ...
    public void accept(ListResponse<T> response) {
        ...
    }
    ...
}
0 голосов
/ 10 июля 2019

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

Мы используем обобщенные значения, чтобы разрешить типам (целое число, число с плавающей запятой и т. Д.) Быть параметром.Когда мы определяем класс или что-то для использования Generics, мы используем эти угловые скобки, но когда мы должны использовать этот тип, нам не нужно использовать угловые скобки

Пример: -

interface Consumer<T> { //Defining Interface that's why using <>

    void accept(T t); //here this method can accept a parameter of T type

    T returnSomething(int n) //here this method is having return type of T
}

Таким образом, в вашем классе ListPresenter вы предоставляете два типа возвращаемого типа для метода accept интерфейса Consumer.

public <T> void accept(ListResponse<T> response)

должен быть этим

public void accept(ListResponse<T> response)

или This, если он имеет общий возвраттип

public T accept(ListResponse<T> response)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...