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

问题描述 投票:2回答:1

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

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 type-parameter type-constructor
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.