Несовместимые типы, использующие дженерики и rxjava - PullRequest
0 голосов
/ 14 мая 2019

Случайные ошибки несовместимых типов, причину которых я не понимаю.

Ошибка: несовместимые типы: Flowable не может быть преобразован в Flowable, где T является переменной типа: T расширяет Packet, объявленный вМетод 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)

Ответы [ 2 ]

1 голос
/ 14 мая 2019

исправлено с помощью ofType () вместо filter ().

1 голос
/ 14 мая 2019
return getPackets().filter(type::isInstance);

возвращает отфильтрованное представление getPackets(), которое имеет тип Flowable<Packet>.

Однако, T может быть любым подклассом Packet, а не просто Packet. И поскольку универсальные шаблоны Java являются инвариантными (например, List<Dog> не является List<Animal>), это не совместимо.

Вам нужно будет разыграть Flowable:

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