在Java中使用通用类型实现通用接口

时间:2019-07-09 20:30:12

标签: java generics

我试图用通用类型在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 个答案:

答案 0 :(得分:2)

您在方法<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) {
        ...
    }
    ...
}

答案 1 :(得分:0)

在ListPresenter类中,您没有正确实现消费者的accept方法

我们使用泛型允许Types(Integer,Float等)作为参数。 当我们定义一个类或要使用泛型的东西时,我们使用这些角括号  但是当我们必须使用这种类型时,我们不必使用角括号

示例:-

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类中,您将两种返回类型提供给Consumer接口的accept方法。

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

应该是这个

public void accept(ListResponse<T> response)

或如果它具有通用返回类型,则为

public T accept(ListResponse<T> response)