【问题标题】:Incompatible types using generics and rxjava使用泛型和 rxjava 的不兼容类型
【发布时间】:2019-05-14 14:33:52
【问题描述】:

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

错误:不兼容的类型: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)

【问题讨论】:

标签: java generics lambda rx-java


【解决方案1】:
return getPackets().filter(type::isInstance);

返回getPackets() 的过滤视图,其类型为Flowable&lt;Packet&gt;

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

你需要投 Flowable:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多