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

Incompatible types using generics and rxjava

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

error: incompatible types: Flowable cannot be converted to Flowable where T is a type-variable: T extends Packet declared in method getPackets(Class)

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

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)
return getPackets().filter(type::isInstance);

returns getPackets() 的筛选视图,类型为 Flowable<Packet>

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

您需要投射 Flowable:

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

通过使用 ofType() 而不是 filter() 修复了它。