PartialFunction的函数定义如下:
trait PartialFunction[-A, +B] extends (A) ⇒ B
PartialFunction允许我们在集合上使用case
和collect
进行过滤。例如,当你有一个整数列表和PartialFunction isEven[Int, String],它将转换为字符串,如果集合中的值是偶数。因此它返回一个新的集合,在定义中返回类型为+B
。
我的问题是,为什么contravariant -A
和covariance +B
?它基本上有能力接受任何输入到任何输出。为什么我们需要指出输入应该是类型a的任意类型或超类型,而返回类型应该是B或它的子类?我们不能直接说:
trait PartialFunction[A, B]
不,不 "基本上允许它接受任何输入到任何输出"。Co-和逆变关系不是微不足道的(在数学意义上)关系,它们是由约束类型严格定义的——正如你可能意识到的那样。
这种特定形式的类型边界,即参数的逆变性和返回类型的协方差是一种普遍现象,不仅限于Scala,而且来自形式类型理论中的函数类型概念,具体如下:
如果T1→T2是函数类型,则它的子类型是具有T1 <: S1和S2 <: T2性质的任意函数S1→S2。
允许上述函数类型的良好定义的子类型关系