Retrofit - 使用带继承的响应类

时间:2017-11-01 00:25:36

标签: android generics retrofit

我尝试通过从基础响应类继承来重用单个改进的api调用。

但是我无法做到。

我会尝试用例子说明自己(这不是一个具体的场景。我只是想弄清楚主要想法):

拥有此响应对象和api服务:

public class UserDetailsResponse
{
    private int userId;
}

public class ExtendedUserDetailsResponse extends UserDetailsResponse
{
    private int userAdditionalId;
}

interface APIService
{
   @GET("/UserDetails/")
   Call<UserDetailsResponse> getUserDetails(@Query("id") String userId);
}

有没有办法将getUserDetails api与ExtendedUserDetailsResponse对象一起使用?

这个给了我编译错误:

   mService.getUserDetails("123").enqueue(new Callback<ExtendedUserDetailsResponse>()
        {

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

            }

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

            }
        });

我该如何解决这个问题?或至少与此类似的东西,不使用特定派生类的新api调用?

谢谢!

2 个答案:

答案 0 :(得分:0)

您收到编译错误,因为您使用了错误的回调对象:

只需更改此行:

Call<UserDetailsResponse> getUserDetails(@Query("id") String userId);

Call<ExtendedUserDetailsResponse> getUserDetails(@Query("id") String userId);

或者取决于响应更改回调中的对象

请注意,ExtendedUserDetailsResponseuserId,因此即使服务器返回ExtendedUserDetailsResponseUserDetailsResponse类型的对象,您也可以使用ExtendedUserDetailsResponse

答案 1 :(得分:0)

您收到错误,因为ExtendedUserDetailsResponse是UserDetailsResponse,但UserDetailsResponse不一定是ExtendedUserDetailsResponse。

为了使其成为通用的,请以这种方式签署您的方法

Call< ExtendedUserDetailsResponse > getUserDetails(@Query("id") String userId);

然后,ExtendedUserDetailsResponse可以访问 userId

请记住使用getter和setter公开userId,以便对其进行解析。