Scala Nothing数据类型

moh*_*med 6 scala

我知道Scala没有什么是底层类型.当我看到API时,它从"Any"扩展,这是层次结构中的顶层.

现在,由于Scala不支持多重继承,我们怎么能说它是底层类型.换句话说,它不直接继承所有类或特征,如Seq,List,String,Int等.如果是这种情况我们怎么能说它是所有类型的底部?

我的意思是,如果我们能够将List [Nothing](Nil)分配给List [String],因为List在scala中是协变的,因为Nothing和String类型之间没有直接关联.我们知道什么都不是底层类型,但我很难看到String和Nothing之间的关系,就像我在上面的例子中所说的那样.

谢谢和问候,穆罕默德

0__*_*0__ 3

现在Scala不支持多重继承

Scala 确实支持多重继承,使用 Trait mixin。目前这不是可交换的,即类型A with B与 不同B with A(Dotty 会发生这种情况),但它仍然是多重继承的一种形式,而且实际上是 Scala 的强项之一,因为它通过线性化规则解决了菱形问题。

顺便说一句,Null是另一种底层类型,继承自Java(也可以说它有Nothing底层类型,因为你可以在任何可能的地方抛出运行时异常)。

我认为你需要区分类继承和类型界限。定义为底层类型并不矛盾Nothing,尽管它不会“显式”继承自任何您想要的类型,例如List. 它更像是一种能力,抛出异常的能力。

如果我们能够将 List[Nothing] (Nil) 分配给 List[String],因为 List 在 scala 中是协变的,那么这怎么可能,因为 Nothing 和 String 类型之间没有直接关联

是的,底部类型的想法是Nothing(除其他外)它也是 的子类型String。所以你可以写

def foo: String = throw new Exception("No")
Run Code Online (Sandbox Code Playgroud)

这只有效,因为Nothing(抛出异常的类型)比声明的返回类型更具体String