scala泛型
scala与java类似,同样存在泛型,使用方括号来定义类型参数
定义类时使用泛型
1 | class Array[T] |
创建实例时使用泛型
1 | val array:Array[String] = Array("aa","bb") |
上界
同样的scala中也有java泛型上下界的概念,java的泛型的上界使用extends来指定
1 | <T extends Number> |
而在scala中是使用的<:关键字来指定
1 | <T <: Number> |
下界
java的泛型的下界使用super来指定
1 | <T super Person> |
而在scala中是使用的>:关键字来指定
1 | <T >: 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]没有从属关系,称为不变