【问题标题】:Implement generic interface with generic type in Java在 Java 中实现具有泛型类型的泛型接口
【发布时间】:2019-07-26 02:44:33
【问题描述】:

我正在尝试使用泛型类型在 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

【问题讨论】:

  • public &lt;T&gt; void accept(ListResponse&lt;T&gt; response) 应该是 public void accept(ListResponse&lt;T&gt; response)(删除第一个 &lt;T&gt;

标签: java generics


【解决方案1】:

您正在重新定义方法 accept(...) 上的泛型参数 &lt;T&gt;。该机制类似于通过同名的局部变量隐藏属性。

public &lt;T&gt; void accept(ListResponse&lt;T&gt; response) 上的 T 没有“耦合”到 public class ListPresenter&lt;T&gt; implements Consumer&lt;ListResponse&lt;T&gt;&gt; 上的 T

可以通过删除方法 accept(...) 声明中的第一个 &lt;T&gt; 来解决此问题:

public class ListPresenter<T> implements Consumer<ListResponse<T>> {
    ...
    public void accept(ListResponse<T> response) {
        ...
    }
    ...
}

【讨论】:

    【解决方案2】:

    在 ListPresenter 类中你没有正确实现消费者的接受方法

    我们使用泛型来允许类型(整数、浮点等)作为参数。 当我们定义一个类或其他东西来使用泛型时,我们使用这些角括号 但是当我们必须使用这种类型时,我们不必使用角括号

    示例:-

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多