免责声明:此问题包含使用 rxjava
的代码库,但问题与它无关。我提供了所有需要的信息,以便那些不熟悉该库的人能够回答。
我有以下方法,根据是否缓存某些数据来选择数据源:
public Observable<? extends MetricDataSource> createForOwners() {
return Observable.defer(new Func0<Observable<? extends MetricDataSource>>() {
@Override
public Observable<? extends MetricDataSource> call() {
if (ownersCache.isCached()) {
return cacheMetricDataSource;
} else {
return androidApiMetricDataSource;
}
}
});
}
编译失败,出现以下错误:
Error:(29, 26) error: method defer in class Observable<T#2> cannot be applied to given types;
required: Func0<Observable<T#1>>
found: <anonymous Func0<Observable<? extends MetricDataSource>>>
reason: cannot infer type-variable(s) T#1
(argument mismatch; <anonymous Func0<Observable<? extends MetricDataSource>>> cannot be converted to Func0<Observable<T#1>>)
where T#1,T#2 are type-variables:
T#1 extends Object declared in method <T#1>defer(Func0<Observable<T#1>>)
T#2 extends Object declared in class Observable
Observable.defer
的签名是:
public final static <T> Observable<T> defer(Func0<Observable<T>> observableFactory)
Func0
基本上包含一个call()
返回泛型类型对象的方法:
public interface Func0<T> { T call(); }
数据源声明为:
private final Observable<AndroidApiMetricDataSource> androidApiMetricDataSource;
private final Observable<CacheMetricDataSource> cacheMetricDataSource;
那么,为什么会失败呢? defer
期待 Observable<T>
我给它一个 Observable<? extends MetricDataSource>
,这应该很适合 T
.
编辑:如果我替换 defer
方法由当前类中的私有(private)方法替换 Observable<T>
至T
在参数和返回类型中,它都会编译。但是,我必须使用原来的Observable
方法。
所以,这样就失败了:
private static <T> Observable<T> defer(Func0<Observable<T>> observableFactory) {
return null;
}
它编译的这个:
private static <T> T defer(Func0<T> observableFactory) {
return null;
}
最佳答案
你能试试这个吗?
public <T extends MetricDataSource> Observable<T> createForOwners() {
return Observable.defer(new Func0<Observable<T>>() {
@Override
public Observable<T> call() {
if (ownersCache.isCached()) {
return cacheMetricDataSource;
} else {
return androidApiMetricDataSource;
}
}
});
}
我不确定,但我猜测这是因为如果您不将其绑定(bind)到 T,它会认为它引用了可能独立更改的不同类型,因此不相等。但不确定
关于java - 无法使用有界通配符传递通用子类的内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33106076/