" - "的目的和定义是什么?和" +"用于特征签名中的输入和返回类型,例如trait Function2[-T1, -T2, +R] extends AnyRef
有人可以在规格中建议确切的位置来阅读它吗?
答案 0 :(得分:3)
这些是方差和协方差注释,用于指定子类型关系如何适用于多态类型。例如,List[+A]
表示列表的内容是协变的:如果您的类型Dog
是Animal
的子类型,则类型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