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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
在Kotlin 1.5中收集流时,结果嵌套两次(Kotlin.Result不能强制转换为`Type`)_Kotlin_Kotlin Coroutines - Fatal编程技术网

在Kotlin 1.5中收集流时,结果嵌套两次(Kotlin.Result不能强制转换为`Type`)

在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

最近,我将我的项目更新为Kotlin 1.5,并注意到在将
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的调查。有同样的问题,也许这与