`Nothing` 有什么用?

What can `Nothing` be used for?

我特别要求 不可空 类型 Nothing

我确实知道 Nothing? 允许我们,例如,过滤 null 以使过载明确,但我正在努力思考 Nothing 的情况有用。

Nothing? 只能有一个值,null。所以 Nothing 可能没有任何价值。重点是什么?为什么不简单地使用 Unit

1。 Nothing 对应 Any?

正如 Any? 是任何其他类型的基类型一样,Nothing 是任何其他类型(甚至可为空的类型)的子类型。

知道这一点后,在下面的例子中 s 将是 String 类型,给定名称是 String?.

val s = name ?: throw IllegalArgumentException("Name required")

throw表达式returnsNothingStringNothing的公共基类型是String。这就是我们想要的,因为这是我们想要与之合作的类型。

如果我们使用 Unit 而不是 Nothing,那么公共基类型将是 Any,这当然不是我们想要的,因为它需要转换为 String之后。

这也是有道理的,因为如果抛出异常,执行将无法继续,因此 s 无论如何都不会再被使用。

2。 Nothing 标记永远无法到达的代码位置

fun foo() {
   throw IllegalArgumentException("...")
   println("Hey") // unreachable code
}

3。类型推断

如果 null 用于初始化推断类型的值,并且没有其他信息可以确定更具体的类型,则推断类型将为 Nothing?.

val x = null           // 'x' has type `Nothing?`
val l = listOf(null)   // 'l' has type `List<Nothing?>

Further reading

Nothing用来告诉编译器永远不会return。例如,


fun main() {
   var name: String? = null
   val notNullName = name ?: fail("name was null")
   println(notNullName)
}

fun fail(message: String): Nothing {
  throw RuntimeException(message)
}

fun infiniteLoop(): Nothing {
   while (true) {
     // Nothingness
   }
}