繁体   English   中英

了解scala.Nothing类型

[英]Understanding of scala.Nothing type

根据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能否请您进一步说明Nothing类型。 任何例子,解释。

谢谢!

def ??? : Nothing = throw new NoImplementedError

没有返回异常,而是引发了与众不同的异常。 例外情况是一种控制流机制,该机制会导致控制立即跳转到调用堆栈中最近的已安装处理程序。 这意味着

val x = ???

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

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

def loop(): Nothing = loop()

val x: Int = loop()

由于x永远不会分配,因此允许。

在Scala中,绝对所有内容都需要具有返回类型。

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

如果一切都需要具有返回类型,那么您将如何实现像???这样的函数??? ,因此它可以由任何函数使用无论它需要返回哪种类型

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

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


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

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

这不会编译,因为Unit是不是String或亚型String 因此,您需要执行以下操作:

def myFunc: String = {
  notYetImplemented
  null
}

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

干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM