“+”和“-”的意思协变和逆变 https://stackoverflow.com/a/674090/1809978分别类型。简而言之,这意味着:
PartialFunction[-A1, +B1]
<: PartialFunction[-A2, +B2]
除非A1 :> A2
and B1 <: B2
, where <:
是一种子类型关系。
“-”通常用于输入参数,“+”用于输出 - 在 C# 中,它们甚至使用各自的关键字in
and out
。还有一些比较原始的Java 中的通用方差支持 https://stackoverflow.com/questions/2501023/demonstrate-covariance-and-contravariance-in-java建立在存在类型之上 - 实际上你可以使用_ <: SomeType
(协方差)或抽象类型成员type T <: SomeType
在 Scala 中也是如此。
不带修饰符PartialFunction[A1, B1]
与 a 没有直接关系PartialFunction[A2, B2]
(换句话说,它是不变的)。
附:此类类型还受到一些限制,例如协变(“+”)类型不能处于逆变位置(只能从方法返回它),反之亦然。这样做是为了支持里氏替换原则 https://en.wikipedia.org/wiki/Liskov_substitution_principle并且自然可以通过“in”/“out”解释来理解。
另外,值得注意的是A => B
(语法糖为Function1
) 本身正在使用协方差/逆变方差:
trait Function1 [-T1, +R] extends AnyRef
由于这些函数可以通过子类型进行扩展,这使得它们在理论上也是部分的(尽管这不是 Scala 处理这些函数的方式)——甚至技术上 Scala 中的“全部”FunctionN 也可以扩展、重新定义、返回 null 等等。