Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava2观测值是协变的吗?或者:缩小可观察范围(向上投射其值类型)是否安全?_Java_Rx Java2_Upcasting_Narrowing - Fatal编程技术网

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);