根据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
您能否澄清一下关于什么类型的更多信息。任何例子,解释。
谢谢!
答案 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
不是String
或String
的子类型。所以你需要这样做:
def myFunc: String = {
notYetImplemented
null
}
哪个不方便,我们写一个值来返回,即使教过我们也永远不会达到这个代码。
干杯