【发布时间】:2021-02-16 22:06:50
【问题描述】:
如果我有一个密封类,例如
sealed class Result {
object Success: Result()
object Failure: Result()
}
当语句不是穷举时为什么会编译,而当表达式不能编译时?
when(getResult()) { // `when` doesn't show a red squiggly, compiles file
Result.Success -> {}
}
val result = when(getResult()) { // <--- when shows a red squiggly, doesn't compile
Result.Success -> {}
}
要使其成为 when 语句的编译错误,只需调用详尽的扩展属性:
when(getResult()) { // `when` NOW shows a red squiggly
Result.Success -> {}
}.exhaustive
我正在观看YouTube: Sealed classes - Kotlin Vocabulary,他们建议使用以下代码来克服这个问题,但我想了解为什么会有差异。这应该有助于我理解为什么以下 Kotlin 通用扩展属性可以解决问题。
val <T> T.exhaustive: T
get() = this
编辑:感谢 Tenfour04,我知道为什么。我只是不知道为什么这个exhaustive 扩展函数会起作用。
【问题讨论】:
-
好的,我认为如果它不是详尽无遗的,那将是危险的。但是你不能对 when 表达式说同样的话吗?我们会怎么做?我想这并不危险,只是什么都不会发生。
-
是的,我现在完全理解那部分了(我更新了问题)。但是
exhaustive扩展属性添加编译错误的原因是它把when语句变成了表达式?不太清楚那里发生了什么 -
我已经添加了它,它实际上只是一个 4 分钟的视频,但基本上调用
when(){}.exhaustive使它成为编译错误。这是一个我不明白/没有解释的巧妙技巧
标签: kotlin