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

标签 java generics bounded-wildcard

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

相关文章:

TypeScript 泛型 - 类型推断

Java 泛型 : get class of generic method's return type

Java反射: getting correct type of parameterized generic superclass method

java - 为什么 ArrayList<ArrayList<T>> 到 Iterable<Iterable<T>> 的隐式转换是不可能的?

java - 使用有界通配符推断类型的问题

java - 有没有办法让对象只能由访问特定方法的第一个线程使用?

java - eclipse 中的 "Installed Software"与 "Features"与 "Plug-ins"

java - 文件选择器的标题

java - 在 Java 中如何将二进制数转换为 BigInteger?

java - 强制接口(interface)方法返回值为多个类的通配符