【发布时间】:2018-11-22 21:35:05
【问题描述】:
我有一个普通的 Transformer,它只是使用给定的谓词过滤列表:
public class ListFilter<T> implements Observable.Transformer<List<T>, List<T>> {
private final Predicate<T> predicate;
private ListFilter(Predicate<T> predicate) {
this.predicate = predicate;
}
public static <T> Observable.Transformer<List<T>, List<T>> create(Predicate<T> predicate) {
return new ListFilter<>(predicate);
}
@Override
public Observable<List<T>> call(Observable<List<T>> listObservable) {
return listObservable
.flatMap(list -> Observable.from(list)
.filter(predicate::test)
.toList());
}
}
现在我可以过滤具有最少样板的项目列表,如下所示:
repository.observeItems() // returns Observable<List<SomeItem>>
.compose(ListFilter.create(item -> /* some filter logic */)
但有一点我无法解释:
List<? extends Dummy> list = SomeDummyFactory.create();
BehaviorSubject<List<? extends Dummy>> subject = BehaviorSubject.create(list);
// #1 -> ok
BehaviorSubject.create(list)
.compose(ListFilter.create(item -> /* `item` is `Dummy` */)
...
// #2 -> error
subject
.compose(ListFilter.create(item -> /* `item` is `Object` */))
...
// #3 -> ok
subject
.map(any -> any) // do nothing
.compose(ListFilter.create(item -> /* `item` is `Dummy` */))
...
我在#2 和#3 之间看到的唯一区别是Transformer<T, R> 的预期通配符:
- _#2:
Transformer<? super List<? extends Dummy>, ? extends R> - _#3:
Transformer<? super List<capture of ? extends Dummy>, ? extends List<capture of ? extends Dummy>
所以有几个问题:
- 为什么
Object是第二种情况下的item类型(而不是Dummy)? - 为什么 Java 在第二种情况下不能推断出 Transformer 的返回类型?
-
map运营商如何提供帮助? - 为什么第一种情况可以正常工作?
【问题讨论】:
标签: java generics collections rx-java rx-java2