当前位置: 首页 > 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)}
}
http://www.lryc.cn/news/356013.html

相关文章:

  • 【本周面试问题总结】
  • SaltStack
  • 【Rust日报】Rust 中的形式验证
  • vue3项目中新增修改时使用nextTick时遇到的问题
  • 算法训练 | 二叉树Part7 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数
  • C++面向对象程序设计 - 标准输出流
  • 警惕Mallox勒索病毒的最新变种hmallox,您需要知道的预防和恢复方法。
  • 2024年华为OD机试真题-火星文计算-C++-OD统一考试(C卷D卷)
  • 3.00001 postgres如何初始化系统参数?
  • C# 读取 CSV 文件的方法汇总
  • element+ 引入图标报错 Failed to resolve import “@element-plus/icons-vue“ from “
  • Github 2024-05-25 开源项目日报 Top10
  • VPN的详细理解
  • java后端轮播图的设计
  • upload-labs 21关解析
  • 常用汇编指令
  • LabVIEW软件需求分析文档内容和编写指南
  • spring cache(三)demo
  • Android 应用开发语言选择对比
  • Git 小白入门到进阶—(基本概念和常用命令)
  • 大数据框架总结(全)
  • 44、Flink 的 Interval Join 详解
  • H6246 60V降压3.3V稳压芯片 60V降压5V稳压芯片IC 60V降压12V稳压芯片
  • 【MySQL精通之路】查询优化器的使用(8)
  • Docker in Docker(DinD)原理与实践
  • 科技前沿:IDEA插件Translation v3.6 带来革命性更新,翻译和发音更智能!
  • 【并发小知识】
  • python将多个音频文件与一张图片合成视频
  • JavaEE:Servlet创建和使用及生命周期介绍
  • 【Python设计模式15】适配器模式