+ - 在Scala中签署通用声明

Ari*_*l T 44 generics scala

我在这个链接中查看了PartialFunction的文档:

trait PartialFunction[-A, +B] extends (A) ? B
Run Code Online (Sandbox Code Playgroud)

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

dk1*_*k14 29

"+"和" - " 分别表示协变和逆变类型.简而言之,它意味着:

PartialFunction[-A1, +B1]<:PartialFunction[-A2, +B2]仅当A1 :> A2B1 <: B2,在哪里<:是子类型关系.

" - "通常用于输入参数,"+"用于输出 - 在C#中,它们甚至使用相应的关键字inout.在存在类型上构建的Java中还有一些更原始的泛型方差支持 - 实际上你也可以在Scala中使用_ <: SomeType(协方差)或抽象类型成员type T <: SomeType.

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

PS对这些类型也有一些限制,例如协变("+")类型不能处于逆变位置(您只能从方法返回它),反之亦然.这样做是为了支持Liskov替换原则,并且通过"in"/"out"解释自然可以理解.

此外,值得注意的是A => B(语法糖Function1)本身使用的是co/contra-variance:

 trait Function1 [-T1, +R] extends AnyRef
Run Code Online (Sandbox Code Playgroud)


Max*_*xim 16

它是协方差和逆变.https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)

基本上它说Generic类型继承如何工作.来自Scala的简单样本 - trait Seq[+A] 由于+,代码

val s: Seq[Person] = Seq[Student]()
Run Code Online (Sandbox Code Playgroud)

将编译,因为学生扩展了Person.没有+它将无法正常工作

更复杂的样本 -

class C[-A, +B] {
  def foo(param: A): B = ???
}

class Person(val name: String)

class Student(name: String, val university: String) extends Person(name)

val sample: C[Student, Person] = new C[Person, Student]
Run Code Online (Sandbox Code Playgroud)


Mic*_*son 5

为了补充其他答案,这里是scala-lang网站上差异文档的链接:

https://docs.scala-lang.org/tour/variances.html