`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
表达式returnsNothing
,String
和Nothing
的公共基类型是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?>
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
}
}
我特别要求 不可空 类型 Nothing
。
我确实知道 Nothing?
允许我们,例如,过滤 null
以使过载明确,但我正在努力思考 Nothing
的情况有用。
Nothing?
只能有一个值,null
。所以 Nothing
可能没有任何价值。重点是什么?为什么不简单地使用 Unit
?
1。 Nothing
对应 Any?
正如 Any?
是任何其他类型的基类型一样,Nothing
是任何其他类型(甚至可为空的类型)的子类型。
知道这一点后,在下面的例子中 s
将是 String
类型,给定名称是 String?
.
val s = name ?: throw IllegalArgumentException("Name required")
throw
表达式returnsNothing
,String
和Nothing
的公共基类型是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?>
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
}
}