Scala教程(十五)Scala的特性逆变与协变
1 逆变与协变
1.1 概念
covariant协变:使你能够使用比原始指定的类型的子类,如:C[+T]:如果A是B的子类,那么C[A]是C[B]的子类。
contravariance逆变:使你能够使用比原始指定的类型的父类,如:C[-T]:如果A是B的子类,那么C[B]是C[A]的子类。
Invariance不变。你只能使用原始指定的类型,不能协变和逆变,如:C[T]:无论A和B是什么关系,C[A]和C[B]没有从属关系。
class Person
class Student extends Person
class C[+T](val args: T)
// 子类型继承协变类型,具体子类
class S[+T](args: T) extends C[T](args)
图解:
含义 | Scala中的标记 |
covariant协变 | C[A]是C[B]的子类 [+T] |
contravariant(逆变) | C[B]是C[A]的子类 [-T] |
invariant(不变) | C[A]和C[B]不相关 [T] |
1.2 协变返回值
// P类型:协变返回值要求是T的父类
class P[+T](val first: T, val second: T) {
// 返回值要求泛型限定R>:T,R以T为下界,R是T的父类
def replaceFirst[R >: T](newFirst: R) = new P[R](newFirst, second);
}
--以上为Scala的特性逆变与协变,谢谢大家对我的关注。
——厚积薄发(yuanxw)