需要不兼容的类型

时间:2017-11-21 04:59:12

标签: java android lambda rx-android

我有那个代码(不是我的代码):

Error:(56, 44) error: incompatible types: bad return type in lambda
expression Observable<CAP#1> cannot be converted to Observable<?
extends CAP#1> where CAP#1 is a fresh type-variable: CAP#1 extends
Object from capture of ? extends Object

当我尝试在Android Studio中编译时,出现以下错误:

menuBarButtons.add(new TextButton("File", 0, 0, 20, menuBarHeight, (() -> println("Test")) ));

环境: AS 3.0.1
API(编译,目标):27.0.0
Java兼容性:1.8
RXJava:1.1.1
RxAndroid:1.1.0

我需要进行类型转换/返回以满足lambda函数吗?

1 个答案:

答案 0 :(得分:1)

请注意,?的每次出现都可能是不同的类型。例如:

List<?> list1 = ...;
List<?> list2 = ...;

list1.addAll(list2);

在addAll操作中会失败,因为无论list1或list2的实际元素时间如何,该行都必须编译,并且有一个“无限”数量的组合不起作用(例如List<String> list1 ... List<Double> list2)。

你需要做的是使用类型参数绑定到实际代表相同类型的?相同的类型(或者可能是另一个的超级或子级:

private static class RxCallAdapterWrapper<T> implements CallAdapter<Observable<T>> {
    private final CallAdapter<T> wrapped;
    @Override
    public <R> Observable<T> adapt(Call<R> call) {
        Observable<T> observableWrapped = wrapped.adapt(call);
        return observableWrapped.onErrorResumeNext(throwable -> {

            if (notHasNetworkConnection()) {
                return Observable.error(new NoConnectionException());// Here happens the error
            }

            return Observable.error(throwable);
        });
    }
.... Other code
}

这里我假设所有?的意图都是相同的类型,现在由类型参数T表示。然而,情况可能并非如此。如果是,请告诉我什么是失败的,我们可以找到更准确的答案。