【问题标题】:Is it possible to auto-detect classes and to generate types for generics at compile time?是否可以在编译时自动检测类并为泛型生成类型?
【发布时间】:2018-05-27 01:40:30
【问题描述】:

假设包com.my.package中存在三个类MyClass1MyClass2MyClass3。在其他地方的方法中,我尝试创建一个泛型类型实例,其中每个类只代表一次回调的类型:

    call.enqueue(new Callback<MyClass1>(){...});
    call.enqueue(new Callback<MyClass2>(){...});
    call.enqueue(new Callback<MyClass3>(){...});

我想实现对特定包中的类的自动检测,然后创建这种类型的泛型,而不是手动输入每个类。

需要此功能,因为可以在 com.my.package 中添加或删除类,并且我不想在其他地方更改代码。即使我可以访问 java.lang.Class 对象的列表,我仍然无法从 Class 对象中生成泛型类型。我知道泛型的类型不能在运行时声明(因此反射已经结束),但是,在我看来,所有必需的信息在编译时都可用。

有没有办法做到这一点?

(在我使用 Retrofit 的应用程序中,Gson 需要尖括号中 POJO 的具体类型才能解析 JSON 数据。底层模型非常复杂并且可以更改。)

【问题讨论】:

  • 如果您正在使用RetrofitGson,在您的回调中response.getBody() 已经为您提供了您的类的实例
  • 是的,但是我在调​​用call.enqueue(new Callback&lt;TypeOfResponseIWannaHave&gt;(){...})时必须预先确定类型
  • 您想要为您的所有Call&lt;...&gt; api 提供通用回调?
  • 为什么需要初始化?你只是从你的回应中得到实例。你不应该创建响应

标签: java generics callback retrofit2


【解决方案1】:

无论如何,您不应该创建响应。您必须从 API 获取响应实例:

public class MyCallback<T> implements Callback<T> {

    @Override
    public void onResponse(Call<T> call, Response<T> response) {
        if (response.isSuccessful()) {
            T body = response.body(); // This is your response instance
        } else {
            // 404/500... error
        }
    }

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

【讨论】:

  • 我仍然需要告诉 Retofit 应该写入 json 数据的对象的类型。入队时 MyCallback T 必须是已定义的类型。在我的 ApiService 界面中,我只想使用一种方法,例如 @GET("/{endpoint}") Call&lt;? extends AbstractDataComponent&gt; getElement(String endpoint);,而不是单独声明 `Call getProject、Call getPartner、Call getOffer 等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 2017-06-10
  • 2014-11-06
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
相关资源
最近更新 更多