因此,在深入了解反思的深度之后,我发现您可以实现ParameterizedType
(因为它是一个接口)并使用它来生成来自改造的不同调用。
里面我CallAdapter.Factory
实现我创造了这个类型:
private static class AwesomeResponseType implements ParameterizedType {
private final Type innerType;
public BrainResponseType(Type innerType) {
this.innerType = innerType;
}
@Override
public Type[] getActualTypeArguments() {
return new Type[] {innerType};
}
@Override
public Type getRawType() {
return AwesomeResponse.class;
}
@Override
public Type getOwnerType() {
return null;
}
}
和创建适配器时我注入内部类型是这样的:
final Type innerType = getParameterUpperBound(0, (ParameterizedType) returnType);
ParameterizedType parameterizedType = new AwesomeResponseType(innerType);
和使用的parameterizedType
创建自定义CallAdapter
像此:
private static class AwesomeCallAdapter<T> implements CallAdapter<AwesomeCall<?>> {
private final Type responseType;
private AwesomeCallAdapter(Type responseType) {
this.responseType = responseType;
}
@Override
public Type responseType() {
return responseType;
}
@SuppressWarnings("unchecked")
@Override
public <R> AwesomeCall<T> adapt(Call<R> call) {
return new AwesomeCall<>((Call<AwesomeResponse<T>>)call);
}
}
The AwesomeCall
现在可以高兴地处理该预期的AwesomeResponse一个电话:
public class AwesomeCall<T> {
private final Call<AwesomeResponse<T>> call;
public AwesomeCall(Call<AwesomeResponse<T>> call) {
this.call = call;
}
public AwesomeResponse<T> execute() throws IOException {
Response<BrainResponse<T>> response = call.execute();
return response.isSuccessful() ? response.body() : errorResponseFrom(response);
}
private AwesomeResponse<T> errorResponseFrom(Response<AwesomeResponse<T>> response) {
return new AwesomeResponse<>(null, new AwesomeError(response.message()));
}
}
如果使用的是番石榴,我相信你没有实现ParameterizedType
。 TypeToken
有一个API来做到这一点:
TypeToken.of(AwesomeResponse.class).where(new TypeParameter<T>() {}, innerType).getType();
但可悲的是,在GSON的TypeToken
不支持该功能:(