密封的类型安全为何时陈述 – 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 } 

如果有人可以正确地提交这个错误或解释行为,请这样做。