什么都没有用?

时间:2019-06-17 11:34:39

标签: kotlin types kotlin-null-safety

我特别要求提供不可空类型的Nothing

我确实知道Nothing?允许我们例如过滤null来使重载明确,但是我正在努力考虑Nothing有用的实例。

Nothing?可以只有一个值null。因此Nothing可能毫无价值。重点是什么?为什么不简单地使用Unit

2 个答案:

答案 0 :(得分:5)

1。 NothingAny?的对应对象

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

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

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

throw表达式返回NothingStringNothing的通用基本类型为String。那就是我们想要的,因为那是我们想要使用的类型。

如果我们使用Unit代替Nothing,则通用基本类型将是Any,这肯定不是我们想要的,因为它需要强制转换为{{1} }。

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

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

Nothing

3。类型推断

如果使用fun foo() { throw IllegalArgumentException("...") println("Hey") // unreachable code } 初始化推断类型的值,并且没有其他信息来确定更具体的类型,则推断类型将为null

Nothing?

Further reading

答案 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
   }
}