【问题标题】:How to create a global generic class which implements a generic interface?如何创建实现泛型接口的全局泛型类?
【发布时间】:2017-11-22 08:44:44
【问题描述】:

说实话,我需要对多个类使用 Retofit Callback。我不想在每个 UI 页面中用 onResponse 和 onFailour 方法编写回调接口。

所以我决定编写一个全局类来实现 Retrofit Callback 接口。

但我的问题是,我想让它成为通用的,因为有许多不同的 ResponseParser 类将使用这个全局类。

我尝试了下面的方法,但遇到了一个小问题。

public class WebAPIControler implements Callback<TResponse>{

@Override
public void onResponse(Call<TResponse> call, Response<TResponse> response) {

}

@Override
public void onFailure(Call<TResponse> call, Throwable t) {

}
}

这里的编译器找不到 TResponse 类。这里 TResponse 是一个通用类,我想在其中处理所有 ResponseParser 类之王。所以我将它命名为 T 或 TResponse。请帮助我如何处理这个问题。

【问题讨论】:

  • 也许你的意思是public class WebAPIController&lt;TResponse&gt; implements Callback&lt;TResponse&gt;,所以TResponse将是类WebAPIController的泛型类型参数
  • 是的,就是这样。但是你能帮我一点关于如何使用它或者假设我想将 ABCResponseParser 传递给 WebAPIControler 类。我将如何在 T 或 TResponse 的帮助下处理这个问题。

标签: java android generics retrofit2


【解决方案1】:

正如其他人所评论的,您缺少的是public class WebAPIControler&lt;T&gt; 中的泛型类型声明。这就是编译器抱怨 T 不存在的原因。

public class WebAPIControler<T> implements Callback<T> {
    @Override
    public void onResponse(Call<T> call, Response<T> response) {

    }

    @Override
    public void onFailure(Call<T> call, Throwable t) {

    }
}

【讨论】:

  • 是的。你说的对。我可以像WebAPIControler w = new WebAPIControler(); 这样称呼这个类吗?或者我必须遵循它的任何通用规则
  • 你可以像这样实例化它:WebAPIControler&lt;SomeClass&gt; w = new WebAPIControler&lt;&gt;();。这将创建一个 WebAPIControler 实例,其中 TSomeClass 替换。
  • 太棒了..让我检查一次
【解决方案2】:

您必须先将您的类设为泛型类,然后再实现泛型接口。

public class WebAPIControler implements Callback<T>{

@Override
public void onResponse(Call<T> call, Response<T> response) {

}

@Override
public void onFailure(Call<T> call, Throwable t) {

}
}

什么是 T?

E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
T - Type
V - Value
S,U,V etc. - 2nd, 3rd, 4th types

Source

我建议你只实现泛型接口,你的类不需要是泛型的。

更新

a.create 接口

interface CustomSubscriber<T>  {
void test(T object);
}

b.用任何对象实现你的接口

public class WebAPIControler implements CustomSubscriber<JsonObject>{

@Override
public void test(JsonObject object) {

}
}

【讨论】:

  • 谢谢阿克斯。但是当我编写 Callback 或 Callback 时,它会抛出红色错误,即找不到 TResponse 等,因为它不是一个类..所以我必须为所有 Response 类纠正一个基类并在 TResponse 中扩展,比如回调
  • 或类似的公共类公共类WebAPIControler 实现回调 实现回调
  • 我正在更新我的答案。请检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 2020-02-19
  • 1970-01-01
相关资源
最近更新 更多