当前位置: 首页 > news >正文

详解 Scala 的泛型

一、协变与逆变

1. 说明

  • 协变:Son 是 Father 的子类,则 MyList[Son] 也作为 MyList[Father] 的 “子类”
  • 逆变:Son 是 Father 的子类,则 MyList[Son] 作为 MyList[Father] 的 “父类”
  • 不变:Son 是 Father 的子类,则 MyList[Father] 与 MyList[Son] 之间 “无父子关系“

2. 语法

// 不变
class MyList[T]{}// 协变
// class MyList[+T]{}// 逆变
// class MyList[-T]{}class Parent{}
class Child extends Parent{}
class SubChild extends Child{}object TestGenerics {def main(args: Array[String]): Unit = {// 不变var mylist1: MyList[Child] = new MyList[Child]// var mylist2: MyList[Parent] = new MyList[Child] // error,无父子关系// 协变// var mylist1: MyList[Child] = new MyList[Child]// var mylist2: MyList[Parent] = new MyList[Child]// var mylist3: MyList[Child] = new MyList[SubChild]// 逆变// var mylist1: MyList[Child] = new MyList[Child]// var mylist2: MyList[Child] = new MyList[SubChild] // error, 父子关系逆转// var mylist3: MyList[SubChild] = new MyList[Child]}
}

二、泛型上下限

泛型的上下限的作用是对传入的泛型进行限定

/**[T <: Class]:泛型上限,类型 T 只能是 Class 或 Class 子类[T >: Class]:泛型下限,类型 T 只能是 Class 或 Class 父类
*/
class Parent{}
class Child extends Parent{}
class SubChild extends Child{}object TestGenerics {def main(args: Array[String]): Unit = {def test[A <: Child](a: A) { // 类型只能是 Child及其子类println(a.getClass.getName)}test[Child](new Child)test[Child](new SubChild)test[SubChild](new SubChild)// test[Parent](new Child) // error}
}

三、上下文限定

1. 说明

​ 上下文限定是将泛型和隐式转换的结合产物,以下两者功能相同,使用上下文限定 [A : Ordering] 之后,方法内无法使用隐式参数名调用隐式参数,需要通过 implicitly[Ordering[A]] 获取隐式变量,如果此时无法查找到对应类型的隐式变量,会发生出错误

2. 语法

/**def f[A: B](a: A) = println(a) //等同于 def f[A](a: A)(implicit arg: B[A]) = println(a)
*/
object TestGenerics {def main(args: Array[String]): Unit = {def f[A: Ordering](a: A, b: A) = implicitly[Ordering[A]].compare(a, b)def f[A](a: A, b: A)(implicit ord: Ordering[A]) = ord.compare(a, b)}
}

相关文章:

  • 爬虫视图展示之 Power BI
  • JS 实现鼠标框选(页面选择)时返回对应的 HTML 或文案内容
  • CSS学习笔记:Less
  • 【class18】人工智能初步----语音识别(4)
  • 边缘计算网关的用途及其使用方法-天拓四方
  • LeetCode 474.一和零
  • Window VScode配置Conda教程(成功版)
  • hadoop学习笔记
  • nginx编译安装手把手教学
  • Flutter 中的 Flow 小部件:全面指南
  • 嵌入式C语言指针详细解说
  • AI爆文写作:使用AI来帮你拆分吧,过程丝滑,效率翻倍:拆选题、拆标题、拆结构、拆逻辑、拆段落、收集素材吧!
  • 深度学习500问——Chapter09:图像分割(3)
  • 开发者的福音:免去搭建服务,让你的应用开发变得像吃蛋糕一样简单!
  • 无人机侦察:雷达系统概述
  • JSDuck 与 AngularJS 融合技巧
  • orm2 中文文档 3.1 模型属性
  • Python进阶细节
  • Spark学习笔记之相关记录
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 分享几个不错的工具
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 解析带emoji和链接的聊天系统消息
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 力扣(LeetCode)22
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 驱动程序原理
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 使用权重正则化较少模型过拟合
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # linux从入门到精通(三)
  • #android不同版本废弃api,新api。
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (pytorch进阶之路)扩散概率模型
  • (八)Spring源码解析:Spring MVC
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十三)MipMap
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (五)Python 垃圾回收机制
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)编辑寄语:因为爱心,所以美丽
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .gitignore不生效的解决方案