Java 改进方法返回通配符

Java 改进方法返回通配符,java,android,retrofit,retrofit2,Java,Android,Retrofit,Retrofit2,我有一个API响应,它一般用于返回应用程序各种活动的数据。为了使应用程序尽可能通用和灵活,我们设置了一个API来提供URL集合,以用于在我们的活动中创建各种行。我们的基本对象看起来像: public class BaseApiObject { @SerializedName("apiVersion") private String apiVersion = null; @SerializedName("totalResults") private Integer

我有一个API响应,它一般用于返回应用程序各种活动的数据。为了使应用程序尽可能通用和灵活,我们设置了一个API来提供URL集合,以用于在我们的活动中创建各种行。我们的基本对象看起来像:

public class BaseApiObject {

    @SerializedName("apiVersion")
    private String apiVersion = null;
    @SerializedName("totalResults")
    private Integer totalResults = null;
}
public class ScreenItem extends BaseApiObject {
     @SerializedName("apiUrls")
     private List<String> apiUrls = new ArrayList<>() ;
}
我们对该活动的反应如下:

public class ActivityApiResponse extends BaseApiObject {
    @SerializedName("results")
    private List<ScreenItem> results = new ArrayList<>();
}
公共类ActivityApiResponse扩展了BaseApiObject{
@SerializedName(“结果”)
私有列表结果=新建ArrayList();
}
屏幕项目如下所示:

public class BaseApiObject {

    @SerializedName("apiVersion")
    private String apiVersion = null;
    @SerializedName("totalResults")
    private Integer totalResults = null;
}
public class ScreenItem extends BaseApiObject {
     @SerializedName("apiUrls")
     private List<String> apiUrls = new ArrayList<>() ;
}
公共类ScreenItem扩展了BaseApiObject{
@SerializedName(“APIRLs”)
私有列表apirls=newarraylist();
}
我希望能够通过改装实现以下功能:

@GET("{url}")
Call<? extends BaseApiObject> getUrl(@Path("url") String url);
@GET(“{url}”)

调用最后,我需要创建自己的反序列化程序。我获取JsonDeserializationContext,然后根据json响应中返回的类型解析元素

例如,假设我的json看起来像:

{ "shapes": 
  [ 
    {"type": "circle", "radius": 2},
    {"type": "rectangle", "width": 3, "height": 2},
    {"type": "triangle", "sides": [3, 4, 5]}
  ],
  "apiVersion": "0.1.0",
  "totalResults": "3"
}
在我的反序列化程序中,我将查看循环中的形状类型,并执行如下操作:

switch(jsonObject.get("type").getAsString()) {
    case "circle":
        return context.deserialize(jsonObject, Circle.class);
        break;

    case "rectangle": 
        return context.deserialize(jsonObject, Rectangle.class);
        break;

    case "triangle":
        return context.deserialize(jsonObject, Triangle.class);
        break;

    default:
        return context.deserialize(jsonObject, Shape.class);
        break; 
}