java - 改造自定义回调通用类型

标签 java android generics retrofit retrofit2

我正在扩展默认的 Retrofit 2 回调:

abstract class APICallback<T> implements Callback<T> {

    @Override
    public void onResponse(Call<T> call, Response<T> response) {
        if (!response.isSuccessful()) {
            // Cast response.body() to my POJO class, results in null
            MyClass myClass = (MyClass) response.body();
        }
    }

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

如何将 Response 的通用类型向下转换为我自己的类? 这个过程应该是自动的吗?我正在为客户端使用 GsonConverter。

最佳答案

我认为你必须修改 AdapterFactory 然后注册改造

public class APICallAdapterFactory extends CallAdapter.Factory {

@Nullable
@Override
public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
    final Type responseType = ((ParameterizedType) returnType).getActualTypeArguments()[0];
    return new CallAdapter<Object, Object>() {
        @Override
        public Type responseType() {
            return responseType;
        }

        @Override
        public Object adapt(Call<Object> call) {
            return new APICallAdapter<>(call);
        }
    };
}

 private static Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(APIService.baseUrl)
        .client(client)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(new APICallAdapterFactory())
        .build();

关于java - 改造自定义回调通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46932671/

相关文章:

C# 基类型列表添加通用子实例

java.util.Calendar 困惑

java - 使用仅字符串格式化程序将纪元时间戳字符串转换为Joda日期时间

java - 如何更正正则表达式以在不区分大小写的情况下找到精确的单词匹配?

android如何使用xmpp-smack在群聊中发送和接收图像和位置(使用 map )

scala - 使用 Scala 的 Java 泛型方法

java - 在依赖接口(interface)上强制执行参数类型?

java - 在mysql数据库中使用servlet插入数据

android - DatePicker 的 setMinDate() 不起作用

android - 什么时候不碰一会儿 Activity ?