gpt4 book ai didi

generics - 在类型为Result的Flowable上调用map函数会引发ClassCastException

转载 作者:行者123 更新时间:2023-12-02 12:47:10 25 4
gpt4 key购买 nike

我正在尝试将Result类型的Flowable中的值映射到其他Result类型。在 map 块中,我只是在Result上调用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)
}
}

此测试将打印以下内容:
java.lang.ClassCastException: kotlin.Result cannot be cast to java.lang.Number

最佳答案

Result类是一个内联类,并且编译器在内部尝试尽可能将其转换为包装的类型。从Kotlin代码调用时,此方法工作正常,但RxJava是用Java编写的。有关更多信息,请参见this article

在这种情况下,我设法通过在源代码中展开Result类并仅使用包装的类型来解决该问题。错误被传播,最终在订户处包装在结果类中。

像这样:

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

关于generics - 在类型为Result的Flowable上调用map函数会引发ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56829324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com