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

标签 java generics lambda rx-java

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

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);

返回 getPackets() 的过滤 View ,其类型为 Flowable<Packet> .

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

您需要转换 Flowable :

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

关于java - 使用泛型和 rxjava 的不兼容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56132919/

相关文章:

c# - 具有不同实现的通用基类中的属性

Java,使用compareTo方法在ToString中按字母顺序打印数组列表

java - 任务队列示例.java : Code 403

java - 将属性绑定(bind)到 ObjectProperty 的属性

c# - 如何创建通用事件引发方法

java - 为什么编译器允许我将泛型集合分配给声明为类特定集合的变量?

java - 如何使 Wordat 以字符串形式返回页面上该位置的单词。如果该行或单词不存在则返回 null

c# - 如何将 BinaryExpression 转换为 Expression<Func<T, bool>>?

lambda - 将函数列表应用于 Racket 中的值列表

c# - C#中的替代内联接口(interface)实现