[英]Java 7 generics type inference fails
我有以下方法:
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。
类型推断可能无法确定T
应该是LoginResult
。 它可以与Java 8一起使用,其中类型推断系统已得到改进。
您可以尝试使用目标类型来帮助编译器:
flatMap(this.<LoginResult> checkApiSuccess())
在
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>
<? super T>
参数。 因此,它期望的东西是login
发出的任何东西的超类,并且由于您没有任何限制,因此可以推断Object
。 您没有提到此return
要求的签名函数是什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.