-
类型关系
Scala 支持在泛型类上使用型变注释,用来表示复杂类型、组合类型的子类型关系间的相关性
-
协变
+T
,变化方向相同,通常用在生产假设
A extends T
, 对于Clazz[+T]
,则Clazz[A]
也可看做Clazz[T]
// 官网示例 abstract class Animal { def name: String } case class Cat(name: String) extends Animal case class Dog(name: String) extends Animal
由于 Scala 标准库中不可变
List
的定义为List[+A]
,因此List[Cat]
是List[Animal]
的子类型,List[Dog]
也是List[Animal]
的子类型,所以可直接将他们当作List[Animal]
使用。// 官网示例 object CovarianceTest extends App { def printAnimalNames(animals: List[Animal]): Unit = { animals.foreach { animal => println(animal.name) } } val cats: List[Cat] = List(Cat("Whiskers"), Cat("Tom")) val dogs: List[Dog] = List(Dog("Fido"), Dog("Rex")) printAnimalNames(cats) // Whiskers // Tom printAnimalNames(dogs) // Fido // Rex }
-
逆变
-T
,变化方向相反,通常用在消费假设
A extends T
, 对于Clazz[-T]
,则Clazz[T]
也可看做Clazz[A]
// 官网示例 abstract class Printer[-A] { def print(value: A): Unit } class AnimalPrinter extends Printer[Animal] { def print(animal: Animal): Unit = println("The animal's name is: " + animal.name) } class CatPrinter extends Printer[Cat] { def print(cat: Cat): Unit = println("The cat's name is: " + cat.name) } object ContravarianceTest extends App { val myCat: Cat = Cat("Boots") def printMyCat(printer: Printer[Cat]): Unit = { printer.print(myCat) } val catPrinter: Printer[Cat] = new CatPrinter val animalPrinter: Printer[Animal] = new AnimalPrinter printMyCat(catPrinter) printMyCat(animalPrinter) // 将 Printer[Animal] 当作 Printer[Cat] 使用 }
-
Scala Type Parameters 2
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...