因此,在深入瞭解反思的深度之後,我發現您可以實現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
不支持該功能:(