4

根据 scala 规范, scala.Nothing 类型 - 所有类型的按钮。类型“Nothing”存在,但 Nothing 的实例不存在。

这个怎么运作:

def ??? : Nothing = throw new NoImplementedError
def sys.error(message: String): Nothing = throw new RuntimeException()
def sys.exit(status: Int): Nothing = {...}

但实际上,所有提到的方法都返回异常。例外def sys.exit您能否详细说明一下Nothing类型。任何例子,解释。

谢谢!

4

2 回答 2

7
def ??? : Nothing = throw new NoImplementedError

不返回异常,它抛出一个不一样的异常。异常是一种控制流机制,它使控制立即跳转到调用堆栈中最近安装的处理程序。这意味着在

val x = ???

x永远不会被赋值,所以x可以有任何类型。这种类型Nothing在 scala 类型系统中,它是所有类型的子类型。

非终止也没有类型,因为它也从不返回值,例如

def loop(): Nothing = loop()

val x: Int = loop()

因此是允许的,因为x永远不会被分配。

于 2016-03-07T17:59:08.083 回答
1

在 Scala中,一切都需要有一个返回类型。

println例如有返回类型Unit,因为它是一个不返回值的计算单位。

如果一切都需要有返回类型,那么你将如何实现一个类似的函数???,以便它可以被任何函数使用,无论它需要返回什么类型?

这就是Nothing它的用途,它是所有其他类型的子类型(就像其他所有类型Any的顶级类型一样),因此返回的函数Nothing可以在任何地方使用,并且类型系统将始终保持一致。

正如您已经注意到返回Nothing的函数永远不会返回值。那是因为 没有任何价值Nothing
您可以将其视为使编译器对仅抛出或停止应用程序或永远循环的函数“满意”的一种方式。


如果你想知道为什么我们不使用Unit而不是Nothing,这里有一个例子:

def notYetImplemented: Unit = throw new Exception() 
def myFunc: String = notYetImplemented

这将无法编译,因为它Unit不是. 所以你需要做:StringString

def myFunc: String = {
  notYetImplemented
  null
}

这不是很方便,对我们来说写一个返回的值,即使被教导我们永远也不会达到这个代码。

干杯

于 2016-03-07T16:56:51.560 回答