密封的类型安全为何时陈述 – kotlin
当在rx流中使用语句时,如何在sealed class
上获得类型安全性?
例如:
private val handleDealOperation: (DealOperation) -> State.Change = { operation -> when (operation) { //how to enforce type safety? `DealOperation` is a sealed class } }
尝试在rx流的上下文中进行类型安全。
source.map(handleDealOperation)
when
表达式确实为密封类提供了类型安全性,但是在这种将lambda存储在变量中的特定情况下似乎存在一个问题。
如果你使用一个函数,它会要求你有所有的分支,如预期的那样:
private fun handleDealOperation(operation: DealOperation): State.Change = when (operation) { // this will show a warning on `when` }
在我的测试中,使用lambda自己似乎工作得很好,他们正确地要求你详尽的when
和从他们返回正确的类型(尝试把你的直接map
调用作为参数),但存储他们在一个变量不知何故编译,即使它看起来真的不应该。
看起来这不是一个sealed class
问题,而是在lambda表达式中的一个问题,当分配给一个变量。 下面的代码例如在运行时编译和崩溃,而不管什么时候的参数是when
:
val doSomething: () -> Int = { when ("") { } } fun main(args: Array<String>) { println(doSomething()) }
例外是:
Exception in thread "main" java.lang.ClassCastException: kotlin.Unit cannot be cast to java.lang.Number
lambda通常不会在没有返回Int
值的最后一个表达式的情况下进行编译,但是它看起来像检查when
语句的返回类型有问题。 但是,首先将它分配给一个局部变量,然后尝试返回它确实会给你正确的检查和错误,而这不会被编译:
val doSomething: () -> Int = { val x = when("") {} x }
所以要回到原来的问题,你可以使用这个作为一个黑客现在:
private val handleDealOperation: (DealOperation) -> State.Change = { operation -> val temp = when (operation) { } temp }
如果有人可以正确地提交这个错误或解释行为,请这样做。
- 将侦听器对象作为函数参数传递给kotlin
- “对象”不是这个域的模式的一部分
- fromCallable中的RXjava2方法不尽人意
- Kotlin库'rxkotlin-0.21.0.jar'具有不受支持的格式。 请更新库或插件
- 如何从kotlin中的花药创建一个新的列表?
- Kotlin JS项目的基本Gradle脚本Kotlin文件是什么样的?
- 我如何在Kotlin中为属性的后台字段设置JsName?
- 那么代码“DetailActivity.ID to it.id”是什么意思?
- Kotlin:'exoPlayer'的类型与重写的var-property的类型不匹配public abstract var exoPlayer:ExoPlayer? 定义在