Scala “解释”-&引用;及+&引用;在'trait function 2[-T1,-T2,+;R]中,扩展了AnyRef`

Scala “解释”-&引用;及+&引用;在'trait function 2[-T1,-T2,+;R]中,扩展了AnyRef`,scala,Scala,特征签名中输入和返回类型使用“-”和“+”的目的和定义是什么,例如trait Function2[-T1,-T2,+R]扩展AnyRef 有人能建议在规范中的确切位置来阅读它吗?“-”是逆变的“+”是协变的 你可以在这个博客中阅读子类型 另外,scala的函数式编程课程也谈到了这一点 “-”允许您使用T的子类,因此它对输入是受限的,“+”允许您返回T的超类型,因此它对输出是通用的 class SuperBase class Base extends SuperBase class SubBa

特征签名中输入和返回类型使用“-”和“+”的目的和定义是什么,例如
trait Function2[-T1,-T2,+R]扩展AnyRef

有人能建议在规范中的确切位置来阅读它吗?

“-”是逆变的“+”是协变的

你可以在这个博客中阅读子类型

另外,scala的函数式编程课程也谈到了这一点

“-”允许您使用T的子类,因此它对输入是受限的,“+”允许您返回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

这些是方差和协方差注释,用于指定多态类型的子类型关系的工作方式。例如,
List[+A]
表示列表的内容是协变的:如果您有一个类型
Dog
,它是
Animal
的子类型,那么类型
List[Dog]
将是
List[Animal]
的子类型。在有趣的符号中:如果你有类型
A