什么都没有用?

Use*_*291 3 types kotlin kotlin-null-safety

我专门要求非空类型Nothing

我确实知道,Nothing?例如,它允许我们过滤null以使重载明确无误,但我一直在努力思考Nothing有用的实例。

Nothing?可以只有一个值null。因此Nothing可以完全没有价值。重点是什么?为什么不简单使用Unit

Wil*_*zel 5

1. Nothing对应Any?

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

知道这一点,很明显,在下面的示例中,s其类型String为,给定名称为String?

val s = name ?: throw IllegalArgumentException("Name required")
Run Code Online (Sandbox Code Playgroud)

throw表达的回报Nothing,并且共同的基本类型StringNothingString。那就是我们想要的,因为那是我们想要使用的类型。

如果要使用Unit而不是Nothing通用的基本类型Any,那就是,这肯定不是我们想要的,因为它将需要强制转换为String之后的类型。

这也是有道理的,因为如果引发异常,则执行不能在那里继续,因此s将不再被使用。

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

fun foo() {
   throw IllegalArgumentException("...")
   println("Hey") // unreachable code
}
Run Code Online (Sandbox Code Playgroud)

3.类型推断

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

val x = null           // 'x' has type `Nothing?`
val l = listOf(null)   // 'l' has type `List<Nothing?>
Run Code Online (Sandbox Code Playgroud)

进一步阅读