kotlin - 使用密封类强制编译错误

使用密封类,您可以使用详尽的 when 表达式,并在表达式返回结果时省略 else 子句:

sealed class SealedClass {
  class First : SealedClass()
  class Second : SealedClass()
}

fun test(sealedClass: SealedClass) : String =
    when (sealedClass) {
      is SealedClass.First -> "First"
      is SealedClass.Second -> "Second"
    }

现在,如果我将 Third 添加到 SealedClass,编译器会提示 test() 中的 when 表达式 并不详尽,我需要为 Thirdelse 添加一个子句。

我想知道当 test() 不返回任何内容时是否也可以强制执行此检查:

fun test(sealedClass: SealedClass) {
    when (sealedClass) {
      is SealedClass.First -> doSomething()
      is SealedClass.Second -> doSomethingElse()
    }
}

如果添加了 Third,此代码段不会中断。 我可以在 when 之前添加一个 return 语句,但是如果其中一个子句的返回类型不是 Unit,这很容易被遗忘并且可能会中断>.

如何确保不会忘记在 when 子句中添加分支?

最佳答案

强制穷举when的方法是通过使用它的值使其成为一个表达式:

sealed class SealedClass {
    class First : SealedClass()
    class Second : SealedClass()
    class Third : SealedClass()
}

fun test(sealedClass: SealedClass) {
    val x = when (sealedClass) {
        is SealedClass.First -> doSomething()
        is SealedClass.Second -> doSomethingElse()
    }  // ERROR here

    // or

    when (sealedClass) {
        is SealedClass.First -> doSomething()
        is SealedClass.Second -> doSomethingElse()
    }.let {}  // ERROR here
}

https://stackoverflow.com/questions/38169933/

相关文章:

properties - Kotlin 中是否有 didSet/willSet 模拟?

java - 为什么在 Java 中实现返回 Unit 的 Kotlin 函数时必须返回 Unit.

android - 这种类型有一个构造函数,必须在这里初始化 - Kotlin

android - Android 中的 AsyncTask 与 Kotlin

android - 如何在 kotlin 中使用 Android Support typedef 注

android - Unresolved reference DaggerApplicationCo

android - kotlin 和 ArgumentCaptor - IllegalStateEx

file - Kotlin 文件与类。有什么不同?

function - 如何将空值分配给 Kotlin 中的函数类型变量?

kotlin - 如何将可变集合变成不可变集合