考虑以下采用* -> *
类类型参数的方法
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]
是某些[𝑎1 >: 𝐿1 <: 𝑈1,…,𝑎𝑛 >: 𝐿𝑛 <: 𝑈𝑛]
的类型参数部分𝑛≥0
,𝑇
是(值或方法)类型。此类型表示命名方法,这些方法采用类型参数𝑆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]
是合法的。