600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > (转)Scala中协变(+) 逆变(-) 上界(:) 下界(:)简单介绍

(转)Scala中协变(+) 逆变(-) 上界(:) 下界(:)简单介绍

时间:2019-08-13 06:36:21

相关推荐

(转)Scala中协变(+) 逆变(-) 上界(:) 下界(:)简单介绍

看源码的时候看到:

trait ExtensionId[T <: Extension] {

没见过这个符号啊<:

Scala上界(<:)和下界(>:)

1) U >: T

这是类型下界的定义,也就是U必须是类型T的父类(或本身,自己也可以认为是自己的父类)。

2) S <: T

这是类型上界的定义,也就是S必须是类型T的子类(或本身,自己也可以认为是自己的子类)。

然后scala中的泛型符号是[T],而不是Java中的<T>.

对于一个带类型参数的类型,比如 List[T],如果对A及其子类型B,满足 List[B]也符合List[A]的子类型,那么就称为covariance(协变),

如果 List[A]是 List[B]的子类型,即与原来的父子关系正相反,则称为contravariance(逆变)。

如果一个类型支持协变或逆变,则称这个类型为variance(翻译为可变的或变型),否则称为invariance(不可变的)

而Scala支持,可以在定义类型时声明(用加号表示为协变,减号表示逆变),如:

tarit Person[+T]{} --协变,在这种情况下,假设S类型是A类型的子类,则Person[S]类型可泛化成Person[T]的子类,也就是被参数化类型的泛化方向与参数类型的方向是一致的,所以称为协变。

tarit Person[-T]{} --逆变,这种情况下,当类型S是类型A的子类型,则Person[A]反过来可以认为是Person[S]的子类型。也就是被参数化类型的泛化方向与参数类型的方向是相反的,所以称为逆变

...

/w517424787/article/details/5168

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。