我在这个链接中查看了PartialFunction的文档:
trait PartialFunction[-A, +B] extends (A) ? B
Run Code Online (Sandbox Code Playgroud)
也许有人可以帮助澄清通用声明中加号和减号的重要性?
dk1*_*k14 29
"+"和" - " 分别表示协变和逆变类型.简而言之,它意味着:
PartialFunction[-A1, +B1]<:PartialFunction[-A2, +B2]仅当A1 :> A2和B1 <: B2,在哪里<:是子类型关系.
" - "通常用于输入参数,"+"用于输出 - 在C#中,它们甚至使用相应的关键字in和out.在存在类型上构建的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)
| 归档时间: |
|
| 查看次数: |
7842 次 |
| 最近记录: |