Use*_*291 3 types kotlin kotlin-null-safety
我专门要求非空类型Nothing。
我确实知道,Nothing?例如,它允许我们过滤null以使重载明确无误,但我一直在努力思考Nothing有用的实例。
Nothing?可以只有一个值null。因此Nothing可以完全没有价值。重点是什么?为什么不简单使用Unit?
Nothing对应Any?就像Any?其他任何类型的基本类型一样,其他任何类型Nothing的子类型(甚至是可为空的子类型)也是如此。
知道这一点,很明显,在下面的示例中,s其类型String为,给定名称为String?。
val s = name ?: throw IllegalArgumentException("Name required")
Run Code Online (Sandbox Code Playgroud)
的throw表达的回报Nothing,并且共同的基本类型String和Nothing是String。那就是我们想要的,因为那是我们想要使用的类型。
如果要使用Unit而不是Nothing通用的基本类型Any,那就是,这肯定不是我们想要的,因为它将需要强制转换为String之后的类型。
这也是有道理的,因为如果引发异常,则执行不能在那里继续,因此s将不再被使用。
Nothing标记永远无法到达的代码位置fun foo() {
throw IllegalArgumentException("...")
println("Hey") // unreachable code
}
Run Code Online (Sandbox Code Playgroud)
如果null用于初始化推断类型的值,并且没有其他信息来确定更具体的类型,则推断类型将为Nothing?。
val x = null // 'x' has type `Nothing?`
val l = listOf(null) // 'l' has type `List<Nothing?>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |