RxJava2观测值是协变的吗?或者:缩小可观察范围(向上投射其值类型)是否安全?
给定一个类RxJava2观测值是协变的吗?或者:缩小可观察范围(向上投射其值类型)是否安全?,java,rx-java2,upcasting,narrowing,Java,Rx Java2,Upcasting,Narrowing,给定一个类Foo和一个类条扩展Foo,似乎将可观察的转换为可观察的-可观察的是只读的,不是吗?但似乎没有任何现成的方法可以在没有警告的情况下做到这一点,比如 Observable<Bar> barObservable = ... Observable<Foo> fooObservable = barObservable.map(Foo.class::cast); // or: Observable<Foo> fooObservable = barObserva
Foo
和一个类条扩展Foo
,似乎将可观察的
转换为可观察的
-可观察的
是只读的,不是吗?但似乎没有任何现成的方法可以在没有警告的情况下做到这一点,比如
Observable<Bar> barObservable = ...
Observable<Foo> fooObservable = barObservable.map(Foo.class::cast);
// or: Observable<Foo> fooObservable = barObservable.cast(Foo.class);
但是RxJava2似乎没有提供这样的方法,这让我怀疑我是否遗漏了什么,并且它不像我想象的那样安全
ETA:As(相对)干净As
map(Foo.class::cast)
/cast(Foo.class)
看起来,我意识到最好是写
barObservable.map(b -> (Foo) b);
因为如果无法将Bar
转换为Foo
,这将导致编译错误
(不过,这对泛型没有帮助;您只会得到一个不安全的强制转换警告。对于泛型,上面的自定义
shown()
实现似乎更安全。)Observable
有一个操作符。您提供的方法就是这样做的方法shorrow()
可能会提供一个包装器,其中包含错误消息等。Java的类型系统在没有警告的情况下不支持这种转换。有一种方法可以更直接地支持协变和逆变,但由于RxJava的目标是版本6,它不能从这些增强中获益。@akarnokd这是一个警告,因为程序员比编译器更了解它是否安全,而@SuppressWarnings
存在于程序员知道它是安全的,但编译器无法判断的情况下。vavr.io提供了shorrow()
作为库的一部分,因为他们知道它是安全的,并且希望减轻程序员在任何地方都必须抑制自己警告的负担。我想问的是,它在RxJava2上下文中是否实际上是安全的。它确实是安全的,因此这是map(Foo.class::cast)
,但它不是类型安全的(事实上,它的类型安全性不如map(b->(Foo)b)
——请参阅我对该问题的更新)。
barObservable.map(b -> (Foo) b);