繁体   English   中英

Java 7泛型类型推断失败

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM