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