在Kotlin 1.5中收集流时,结果嵌套两次(Kotlin.Result不能强制转换为`Type`)
最近,我将我的项目更新为Kotlin 1.5,并注意到在将在Kotlin 1.5中收集流时,结果嵌套两次(Kotlin.Result不能强制转换为`Type`),kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,最近,我将我的项目更新为Kotlin 1.5,并注意到在将Flow与Result组合时出现了一些奇怪和意外的行为。考虑下面的例子: //Kotlin 1.5.0 //协程(kotlinx协程核心)1.5.0 福班 界面监听器{ 成功的乐趣(foo:foo) 失败的乐趣(错误:可丢弃?) } 挂起数据(侦听器:傻瓜侦听器){ 流{emit(Result.success(Foo())} .collect{result->//以供参考 什么时候{ result.issucess->listener.o
Flow
与Result
组合时出现了一些奇怪和意外的行为。考虑下面的例子:
//Kotlin 1.5.0
//协程(kotlinx协程核心)1.5.0
福班
界面监听器{
成功的乐趣(foo:foo)
失败的乐趣(错误:可丢弃?)
}
挂起数据(侦听器:傻瓜侦听器){
流{emit(Result.success(Foo())}
.collect{result->//以供参考
什么时候{
result.issucess->listener.onSuccess(result.getOrThrow())
result.isFailure->listener.onFailure(result.exceptionOrNull())
}
}
}
主要内容(){
运行阻塞{
collectData(对象:傻瓜监听器){
成功时覆盖乐趣(foo:foo){
println(foo)
}
覆盖失败(错误:可丢弃?){
println(错误)
}
})
}
}
上面的编译在运行时失败,原因是:
Exception in thread "main" java.lang.ClassCastException: kotlin.Result cannot be cast to Foo
经过一些调试后,我注意到收集的值(result
)似乎是result
类型,而不是预期的result
:
挂起数据(侦听器:傻瓜侦听器){
流{emit(Result.success(Foo())}
.collect{result->
println(result)//输出:Success(Success(Foo@...))
什么时候{
result.issucess->listener.onSuccess(result.getOrThrow())
result.isFailure->listener.onFailure(result.exceptionOrNull())
}
}
}
当我放弃在collectData
中使用外部提供的侦听器或回调函数的想法,例如,使用全局定义的内容时,问题就消失了:
class-Foo
界面监听器{
成功的乐趣(foo:foo)
失败的乐趣(错误:可丢弃?)
}
val listener=object:doublistener{
成功时覆盖乐趣(foo:foo){
println(foo)
}
覆盖失败(错误:可丢弃?){
println(错误)
}
}
挂起数据(){
流{emit(Result.success(Foo())}
.collect{result->
println(result)//输出:Success(Foo@...)
什么时候{
result.issucess->listener.onSuccess(result.getOrThrow())
result.isFailure->listener.onFailure(result.exceptionOrNull())
}
}
}
主要内容(){
运行阻塞{
收集数据()
}
}
以上操作运行时没有任何错误
在这一点上,我觉得这似乎是语言中的一个bug,但我已经关注这一点太久了,我不是100%确定,我可以在Kotlin YouTrack上提出它之前,先征求第二个意见
我已经看到了,但是这个错误不仅看起来是另一种情况,而且应该在最新版本中得到修复。我也有同样的问题,我将kotlin版本从
1.5.10
降级到1.4.32
,代码运行正常。当切换到1.4.32
时,这显然像是一个错误,代码运行得非常好。如果你给流生成器一个显式类型,比如Flow{…}
,那么这个错误还会发生吗?@BrianYencho是的,在任何地方设置显式类型都没有什么区别。显然我没有深入挖掘,并且已经报告了一个类似的问题(),我相信它有相同的根本原因。谢谢@HenryTwist的调查。有同样的问题,也许这与