gpt4 book ai didi

java - 无法使用有界通配符传递通用子类的内部类

转载 作者:行者123 更新时间:2023-11-30 06:57:59 25 4
gpt4 key购买 nike

免责声明:此问题包含使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com