当适当的类型 Any 和 Nothing 适合类型构造函数形状 F[_] 时,为什么它们是不同的类型?



考虑以下方法,该方法采用* -> *类型的参数

def g[F[_]] = ???

为什么以下内容不是语法错误

g[Any]       // ok
g[Nothing]   // ok

因为

scala> :kind -v Any
Any's kind is A
*
This is a proper type.
scala> :kind -v Nothing
Nothing's kind is A
*
This is a proper type.

那么AnyNothing应该形状错误吗?

引用 Scala 规范:

对于每个类型构造函数𝑇(具有任意数量的类型参数(,scala.Nothing <: 𝑇 <: scala.Any.

https://scala-lang.org/files/archive/spec/2.13/03-types.html#conformance

假设类型参数具有下限𝐿1,…,𝐿𝑛和上限𝑈1,…,𝑈𝑛。如果每个实际类型参数都符合其边界,则参数化类型格式正确,即𝜎𝐿𝑖<:𝑇𝑖<:𝜎𝑈𝑖其中𝜎是替代[𝑎1:=𝑇1,…,𝑎𝑛:=𝑇𝑛]

https://scala-lang.org/files/archive/spec/2.13/03-types.html#parameterized-types

多态方法类型在内部表示为[tps]𝑇其中[tps]是某些𝑛≥0[𝑎1 >: 𝐿1 <: 𝑈1,…,𝑎𝑛 >: 𝐿𝑛 <: 𝑈𝑛]的类型参数部分,𝑇是(值或方法(类型。此类型表示命名方法,这些方法采用类型参数𝑆1,…,𝑆𝑛这些参数符合下限𝐿1,…,𝐿𝑛和上限𝑈1,…,𝑈𝑛,并生成类型𝑇的结果。

https://scala-lang.org/files/archive/spec/2.13/03-types.html#polymorphic-method-types

因此,由于AnyNothing符合F[_]的上限和下限(即相应的AnyNothing(,因此g[Any]g[Nothing]是合法的。

相关内容

最新更新