Java 7泛型类型推断失败

时间:2014-11-11 09:27:40

标签: java generics type-inference rx-java

我有以下方法:

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。

2 个答案:

答案 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的签名函数 是