Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Generics 对类型为Result的Flowable调用map函数会引发ClassCastException_Generics_Kotlin_Rx Java2 - Fatal编程技术网

Generics 对类型为Result的Flowable调用map函数会引发ClassCastException

Generics 对类型为Result的Flowable调用map函数会引发ClassCastException,generics,kotlin,rx-java2,Generics,Kotlin,Rx Java2,我正在尝试将类型为Result的Flowable中的值映射到不同的结果类型。在map块中,我只是对结果调用mapCatching。它不会返回映射值,而是抛出ClassCastException。我写了一个简单的测试来说明我遇到的问题 @Test fun test() { Flowable.just(Result.success(1)) .map { result -> result.mapCat

我正在尝试将类型为Result的Flowable中的值映射到不同的结果类型。在map块中,我只是对结果调用mapCatching。它不会返回映射值,而是抛出ClassCastException。我写了一个简单的测试来说明我遇到的问题

@Test
    fun test() {
        Flowable.just(Result.success(1))
                .map { result ->
                    result.mapCatching { input -> input.toString() }
                }
                .test()
                .values()
                .forEach {
                    println(it)
                }
    }
这将返回以下异常:

java.lang.ClassCastException: kotlin.Result$Failure cannot be cast to kotlin.Result
编辑: 用我自己的映射代码替换mapCatching方法会导致Flowable以另一个ClassCastException终止:

@Test
    fun test() {
        Flowable.just(Result.success(1))
                .map { result ->
                    if (result.isFailure) {
                        return@map Result.failure<String>(result.exceptionOrNull()!!)
                    } else {
                        return@map Result.success(result.getOrNull()!!.toString())
                    }
                }
                .test()
                .errors()
                .forEach {
                    println(it)
                }
    }

结果类是一个内联类,编译器在内部尽可能将其转换为包装类型。当从Kotlin代码调用时,这可以很好地工作,但RxJava是用Java编写的。有关更多信息,请参阅

在本例中,我通过在源代码中展开结果类并仅使用已包装的类型来解决它。错误被传播并最终包装在订阅服务器的结果类中

大概是这样的:

Flowable.just(1)
 .map { it.toString() }
 .map { Result.success(it) }
 .onErrorReturn { Result.failure(it) }
Flowable.just(1)
 .map { it.toString() }
 .map { Result.success(it) }
 .onErrorReturn { Result.failure(it) }