是否可以在编译时自动检测类并为泛型生成类型?

时间:2018-05-27 01:40:30

标签: java generics callback retrofit2

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

    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数据。底层模型非常复杂并且可以更改。)

1 个答案:

答案 0 :(得分:0)

您无论如何都不应该创建响应。您必须从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
    }
}