scala 泛型 上下界 非变 协变 逆变
所属分类 scala
浏览量 829
def getMiddleElement[T](array:Array[T]) = array(array.length / 2)
getMiddleElement(Array(1, 2, 3))
getMiddleElement(Array("a", "b", "c"))
case class Pair[T](var a:T, var b:T)
val pairList = List(Pair("hello", "scala"),Pair(1.0, 2.0),Pair(1, 2))
泛型的上下界
上界 泛型参数为 该类 或 其子类型
[T <: 类型]
下界
[T >: 类型]
class Animal
class Pet extends Animal
class Cat extends Pet
def upBoundTest[T <: Pet](array:Array[T]) = println(array)
def lowBoundTest[T >: Pet](array:Array[T]) = println(array)
upBoundTest(Array(new Pet))
upBoundTest(Array(new Cat))
//
// upBoundTest(Array(new Animal))
lowBoundTest(Array(new Animal))
lowBoundTest(Array(new Pet))
// lowBoundTest(Array(new Cat))
非变 协变 逆变
非变 class Pair[T]{}
默认泛型类 非变
类型B是A的子类型,Pair[A]和Pair[B]没有任何从属关系
Java是一样的
协变 class Pair[+T]
类型B是A的子类型,Pair[B]可以认为是Pair[A]的子类型
参数化类型的方向和类型的方向一致
逆变 class Pair[-T]
类型B是A的子类型,Pair[A]反过来可以认为是Pair[B]的子类型
参数化类型的方向和类型的方向相反
class Super
class Sub extends Super
class Temp1[T]
class Temp2[+T]
class Temp3[-T]
val a:Temp1[Sub] = new Temp1[Sub]
// 非变 编译错误
//val b:Temp1[Super] = a
// 协变
val c: Temp2[Sub] = new Temp2[Sub]
val d: Temp2[Super] = c
// 逆变
val e: Temp3[Super] = new Temp3[Super]
val f: Temp3[Sub] = e
上一篇
下一篇
temporal local activity vs activity
temporal 一些关键概念
CompletableFuture 实例
temporal Workers 为何使用轮询拉取任务
temporal list namespace 调试 堆栈信息
vscode 使用技巧