使用泛型和rxjava的不兼容类型

时间:2019-05-14 14:33:53

标签: java generics lambda rx-java

偶然发现不兼容的类型错误原因,我不明白。

  

错误:类型不兼容:Flowable无法转换为Flowable       其中T是类型变量:       T扩展了在方法getPackets(Class)中声明的Packet

为什么这段代码是错误的?

public Flowable<Packet> getPackets() {
        .....
}

public <T extends Packet> Flowable<T> getPackets(Class<T> type) {

    return getPackets().filter(type::isInstance);
}

Flowablefilter()rxjava的一部分,filter()看起来像这样:

public final Flowable<T> filter(Predicate<? super T> predicate)

2 个答案:

答案 0 :(得分:1)

return getPackets().filter(type::isInstance);

返回类型为getPackets()的{​​{1}}的筛选视图。

但是,Flowable<Packet>可以是T任何子类,而不仅仅是Packet。而且由于Java泛型是不变的(例如Packet不是List<Dog>),所以这是不兼容的。

您需要投放List<Animal>

Flowable

答案 1 :(得分:1)

通过使用ofType()而不是filter()对其进行了修复。