我特别要求提供不可空类型的Nothing
。
我确实知道Nothing?
允许我们例如过滤null
来使重载明确,但是我正在努力考虑Nothing
有用的实例。
Nothing?
可以只有一个值null
。因此Nothing
可能毫无价值。重点是什么?为什么不简单地使用Unit
?
答案 0 :(得分:5)
Nothing
是Any?
的对应对象 Any?
是任何其他类型的基本类型,Nothing
是任何其他类型的子类型(甚至是可为空的类型)。
知道这一点后,很明显,在以下示例中,s
的类型为String
,给定名称为String?
。
val s = name ?: throw IllegalArgumentException("Name required")
throw
表达式返回Nothing
,String
和Nothing
的通用基本类型为String
。那就是我们想要的,因为那是我们想要使用的类型。
如果我们使用Unit
代替Nothing
,则通用基本类型将是Any
,这肯定不是我们想要的,因为它需要强制转换为{{1} }。
这也是有道理的,因为如果抛出异常,执行将无法继续进行,因此String
将不再被使用。
s
标记了永远无法到达的代码位置Nothing
如果使用fun foo() {
throw IllegalArgumentException("...")
println("Hey") // unreachable code
}
初始化推断类型的值,并且没有其他信息来确定更具体的类型,则推断类型将为null
。
Nothing?
答案 1 :(得分:0)
Nothing
用于告诉编译器它将永远不会返回。例如,
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
}
}