Unit
基数为 1。Nothing
基数为 0。
你的第二个例子
def Nothing(companyId: Int): scala.Nothing = {}
不编译。不可能返回 a Nothing
,因为Nothing
没有居民。因此返回的函数Nothing
不能正常返回;它只能抛出异常。
def Nothing(companyId: Int): scala.Nothing = { throw new Exception(); }
Java 的Void
可比性Unit
在于Void
也具有基数 1;它唯一的居民是null
。Java 中没有基数为 0 的类型(也不可能定义这样的类型),因此 Java 没有可与Nothing
. 当然,可以编写一个总是抛出异常的 Java 方法,但返回类型不可能表达这一点。
考虑在集合中使用这些中的每一个时会发生什么。例如, aList[Unit]
可以包含任意数量的Unit
值:
List() : List[Unit]
List((), (), ()) : List[Unit]
而 aList[Nothing]
必然是空的,因为你不能把任何东西放进去。
List() : List[Nothing]
另一个需要注意的重要事情Nothing
是它是所有其他类型的子类型。这是有道理的,因为它没有居民;因此,关于实例的每个命题(命题与类型密切相关Nothing
)都是空洞的。关于为什么这很有用的一个例子,再次考虑列表:
List.empty[Nothing] : List[String]
这里我们将 a 赋予List[Nothing]
类型List[String]
,我们可以这样做,因为List
的类型参数是协变的并且Nothing
是 的子类型String
。请注意,我们不能用 a 来做到这一点List[Unit]
,因为Unit
它不是的子类型String
。