使用泛型和 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);
}
Flowable
和 filter()
是 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() 修复了它。
偶然发现我不明白的不兼容类型错误。
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);
}
Flowable
和 filter()
是 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() 修复了它。