0%

scala泛型

scala泛型

scala与java类似,同样存在泛型,使用方括号来定义类型参数

定义类时使用泛型

1
class Array[T]

创建实例时使用泛型

1
val array:Array[String] = Array("aa","bb")

上界

同样的scala中也有java泛型上下界的概念,java的泛型的上界使用extends来指定

1
2
3
<T extends Number>
或者
<? extends Number>

而在scala中是使用的<:关键字来指定

1
2
3
<T <: Number>
或者
<? <: Number>

下界

java的泛型的下界使用super来指定

1
2
3
<T super Person>
或者
<? super Person>

而在scala中是使用的>:关键字来指定

1
2
3
<T >: Person>
或者
<? >: Person>

协变、逆变和不变

在java中是没有这个概念的,因为java中对于泛型之间的父子关系并不关心,所以List<String> 并不是List<Object> 的子类型,而在scala中却支持这种做法

对于一个带类型参数的类型,比如 List[T],如果对 A 及其子类型 B,满足 List[B]也符合 List[A] 的子类型,那么就称为 covariance(协变) ;如果 List[A]是 List[B]的子类型,即与原来的父子关系正相反,则称为 contravariance(逆变);如果一个类型支持协变或逆变,则称这个类型为 variance(可变的或变型),否则称为 invariance(不可变的)。

那么在定义中如何区分协变、逆变和不变呢?
在声明 Scala 的泛型类型时,“+”表示协变,而“-”表示逆变

  • C[+T]:如果 A 是 B 的子类,那么 C[A]是 C[B]的子类,称为协变
  • C[-T]:如果 A 是 B 的子类,那么 C[B]是 C[A]的子类,称为逆变
  • C[T]:无论 A 和 B 是什么关系,C[A]和 C[B]没有从属关系,称为不变

欢迎关注我的其它发布渠道