-
型別關系
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] 使用 }
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/1987.html
標籤:Scala
