考虑以下方法,该方法采用* -> *
类型的参数
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.
那么Any
和Nothing
应该形状错误吗?
引用 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
因此,由于Any
和Nothing
符合F[_]
的上限和下限(即相应的Any
和Nothing
(,因此g[Any]
和g[Nothing]
是合法的。