了解scala.Nothing类型

时间:2016-03-07 16:28:45

标签: scala nothing

根据scala规范, scala.Nothing类型 - 所有类型的buttom。 输入“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您能否澄清一下关于什么类型的更多信息。任何例子,解释。

谢谢!

2 个答案:

答案 0 :(得分:3)

def ??? : Nothing = throw new NoImplementedError

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

val x = ???
永远不会为

x分配值,因此x可以包含任何类型。此类型在scala类型系统中为Nothing,它是所有类型的子类型。

非终止也没有类型,因为它也永远不会返回一个值,例如

def loop(): Nothing = loop()

val x: Int = loop()
因此允许

,因为永远不会分配x

答案 1 :(得分:1)

在Scala中,绝对一切都需要返回类型。

例如,

Unit的返回类型为???,因为它是一个不返回任何值的计算单位。

如果所有内容都需要返回类型,那么如何实现Nothing之类的函数,以便任何函数可以使用它,无论何种类型它需要返回?

那就是Any的用途,它是所有其他类型的子类型(因为Nothing是每个其他类型的顶级类型),所以函数返回{{1可以在任何地方使用,类型系统将始终保持一致。

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

如果您想知道我们为什么不使用Unit代替Nothing,请举例说明:

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

这不会编译,因为Unit不是StringString的子类型。所以你需要这样做:

def myFunc: String = {
  notYetImplemented
  null
}

哪个不方便,我们写一个值来返回,即使教过我们也永远不会达到这个代码。

干杯