[英]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.