我有以下方法:
protected <T> Func1<ApiResponse<T>, Observable<T>> checkApiSuccess() {
return new Func1<ApiResponse<T>, Observable<T>>() {
@Override
public Observable<T> call(ApiResponse<T> response) {
if (response.isSuccess()) {
return Observable.from(response.getResult());
}
return Observable.error(new ApiException(response.getError()));
}
};
}
为什么这样做:
Func1<ApiResponse<LoginResult>, Observable<LoginResult>>
checkApiSuccessFunc = checkApiSuccess();
return apiService
.login(params)
.flatMap(checkApiSuccessFunc);
但这不是:
return apiService
.login(params)
.flatMap(checkApiSuccess());
我收到编译时错误no suitable method found for flatMap(Func1<ApiResponse<Object>>, Observable<Object>)
。不知何故,当直接使用该方法时,类型T不能再映射到LoginResult。
答案 0 :(得分:2)
类型推断可能无法确定T
应该是LoginResult
。它可以与Java 8一起使用,其中类型推断系统已得到改进。
您可以尝试使用目标类型来帮助编译器:
flatMap(this.<LoginResult> checkApiSuccess())
答案 1 :(得分:0)
在
Func1<ApiResponse<LoginResult>, Observable<LoginResult>>
checkApiSuccessFunc = checkApiSuccess();
return apiService
.login(params)
.flatMap(checkApiSuccessFunc);
编译器从声明的checkApiSuccessFunc类型推断出checkAPISuccess()
的返回类型是什么,并从中推断出其中的所有内容。
但是在
return apiService
.login(params)
.flatMap(checkApiSuccess());
确实没有足够的信息来推断checkApiSuccess()
的类型。 flatMap
期望函数采用<? super T>
参数。所以它期望某些东西是login
发出的超类,并且由于你没有任何限制它的东西,它推断Object
。您还没有提到调用此return
的签名函数
是