解释" - "和" +"在`trait Function2 [-T1,-T2,+ R]中扩展了AnyRef`

时间:2014-08-13 04:18:06

标签: scala

" - "的目的和定义是什么?和" +"用于特征签名中的输入和返回类型,例如trait Function2[-T1, -T2, +R] extends AnyRef

有人可以在规格中建议确切的位置来阅读它吗?

2 个答案:

答案 0 :(得分:3)

这些是方差和协方差注释,用于指定子类型关系如何适用于多态类型。例如,List[+A]表示列表的内容是协变的:如果您的类型DogAnimal的子类型,则类型List[Dog]将是子类型List[Animal]。在有趣的符号中:如果您有类型A<:B,并且您已使用协变类型参数X[+T]定义了类型T,那么X[A]<:X[B]。 &#34; - &#34;用于反演,我发现很难给出一个使用它的例子:一般来说,如果是A<:B,你有X[-T]类型,那么X[B] <: X[A]。您可能希望在编程语言中看到课程的课程,我认为这解释了这一点,以及为什么函数在其参数中是逆变的,并且在结果中是协变的。

答案 1 :(得分:2)

&#34; - &#34;逆变&#34; +&#34;是协变的

您可以在此博客http://blogs.atlassian.com/2013/01/covariance-and-contravariance-in-scala/

中阅读子类型

此外,scala的课程函数式编程也会讨论它。

&#34; - &#34;让你使用T的子类,因此它被限制为输入,&#34; +&#34;让你返回T的超类型,所以它是输出的一般。

class SuperBase

class Base extends SuperBase

class SubBase extends Base

val add: Function1[Base, Base] = { base =>
  new SubBase //ignore this
}

add(new SubBase) //ok
add(new SuperBase) //compilation fail

val result: SuperBase = add(new SubBase) //ok
val result: SubBase = add(new SubBase) //compilation fail