Scala Type Parameters 2
2024-08-30 09:22:34
类型关系
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] 使用
}
最新文章
- Ubuntu14.04无法在var/www内新建文档
- phpstrom正则替换
- 深入理解OOP(第一天):多态和继承(初期绑定和编译时多态)
- django动态表格总结
- Oracle分析函数的项目实践实例
- 简单加密算法在C#中的实现
- JavaScript基本概念(操作符)
- PHP - 遍历文件夹下的所有文件名
- WebLogic部署集群和代理服务器
- javascript第一篇----使用简介
- linux修改TCP最大连接数
- 第6次结对作业--郑锦伟&;古维城
- JavaScript 高级
- Ajax简述
- 【JVM虚拟机】(4)---性能调优
- 去掉word页眉上横线的技巧
- python随机生成6位数验证码
- 腾讯云启动数据库进程,提示No such host is known
- 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-7 混合概率密度
- Linux下阅读MHT文件