2

给定一个 classFoo和一个 class ,将 an 强制转换为 anBar extends Foo似乎应该是安全的——它们是只读的,不是吗?但似乎没有任何开箱即用的方法可以在没有警告的情况下做到这一点,除了类似的东西Observable<Bar>Observable<Foo>Observables

Observable<Bar> barObservable = ...
Observable<Foo> fooObservable = barObservable.map(Foo.class::cast);
// or: Observable<Foo> fooObservable = barObservable.cast(Foo.class);

它编译没有错误,但似乎会产生额外的方法调用开销,除非编译器非常聪明。

其他库(如 vavr.io)具有内置narrow()方法,至少可以为您抑制警告,相当于:

@SuppressWarnings("unchecked")
public static <T> Observable<T> narrow(Observable<? extends T> o) {
  return (Observable<T>) o;
}

但是 RxJava2 似乎没有提供这样的方法,这让我怀疑我是否遗漏了一些东西,它并没有我想的那么安全。


ETA:作为(相对)干净的map(Foo.class::cast)/cast(Foo.class)看起来,我意识到最好写

barObservable.map(b -> (Foo) b);

因为如果Bar不能强制转换为Foo.

(不过,它对泛型没有帮助;你只会得到一个不安全的强制转换警告。对于泛型,narrow()上面的自定义实现似乎更安全。)

4

1 回答 1

0

Observable有一个演员表操作员。

于 2018-03-16T19:41:41.987 回答