Это потому, что компилятор не может перехватить подстановочный тип.
В первом случае вы можете попытаться добавить явный универсальный тип.И <Dummy>
, и <Object>
приведут к ошибке.Тип фактического генератора - (captrue#1 ?) extends Dummy
, который определяется общим возвращаемым значением create
.
Во втором случае ваш subject
универсальный тип - List<? extends Dummy>
.compose
должен принимать Transformer<? super List<? extends Dummy>,? extends R>>
, поэтому универсальный create
должен быть ? extends Dummy
(аналогично случаю 1).Но в текущем контексте компиляции (текущий оператор) тип группового символа не фиксируется.Компилятор не может определить универсальный тип, он просто использует Object
, поэтому возникает ошибка.
В третьем случае map
возвращает символ подстановки обратно.Вы можете попробовать любой метод с общим типом возврата Observable<R>
, все они будут работать.Например, .flatMap(d -> Observable.just(d))
.
Но обратите внимание, ваш случай 3 - это просто обходной путь.Рекомендуемое решение позволяет вашему универсальному ListFilter
быть более гибким.
Вы должны определить его как ObservableTransformer<List<? extends T>, List<? extends T>>
class ListFilter<T> implements ObservableTransformer<List<? extends T>, List<? extends T>> {
public static <T> ListFilter<T> create(Predicate<T> predicate) {
return new ListFilter<>(predicate);
}
private final Predicate<T> predicate;
private ListFilter(Predicate<T> predicate) {
this.predicate = predicate;
}
@Override
public ObservableSource<List<? extends T>> apply(Observable<List<? extends T>> upstream) {
return upstream
.flatMapSingle(list -> Observable.fromIterable(list)
.filter(predicate::test)
.toList());
}
}