我在this link中查看PartialFunction的文档:

trait PartialFunction[-A, +B] extends (A) ⇒ B

也许有人可以帮助澄清通用声明中加号和减号的重要性?

最佳答案

“+”和“-”分别表示covariant and contravariant类型。简而言之,它意味着:
PartialFunction[-A1, +B1] PartialFunction[-A2, +B2]仅当A1 :> A2B1 <: B2时,其中<:是子类型关系。

“-”通常用于输入参数,“+”通常用于输出-在C#中,它们甚至分别使用关键字inout。还有一些基于存在类型的更原始的generic variance support in Java-实际上,您也可以使用Scala中的_ <: SomeType(协方差)或抽象类型成员type T <: SomeType来完成此操作。

没有修饰符,PartialFunction[A1, B1]将与PartialFunction[A2, B2]没有直接关系(换句话说,它将是不变的)。

附言此类类型也有一些限制,例如covariant(“+”)类型不能处于互变位置(只能从方法中返回),反之亦然。这样做是为了支持Liskov Substitution Principle,并且自然可以通过“in” /“out”解释来理解。

另外,值得注意的是A => B(Function1的语法糖)本身正在使用协方差/相反方差:

 trait Function1 [-T1, +R] extends AnyRef

由于可以通过子类型扩展这些函数,这从理论上讲也使它们成为部分函数(尽管不是Scala对待它们的方式)-甚至从技术上讲,Scala中的“全部” FunctionN都可以扩展,重新定义,返回null等等。

10-08 13:54