当前位置: 首页 > 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)}
}

相关文章:

详解 Scala 的泛型

一、协变与逆变 1. 说明 协变&#xff1a;Son 是 Father 的子类&#xff0c;则 MyList[Son] 也作为 MyList[Father] 的 “子类”逆变&#xff1a;Son 是 Father 的子类&#xff0c;则 MyList[Son] 作为 MyList[Father] 的 “父类”不变&#xff1a;Son 是 Father 的子类&…...

【本周面试问题总结】

01.如何判断链表中是否有环 ①穷举遍历&#xff1a;从头节点开始&#xff0c;依次遍历单链表中的每一个节点。每遍历到一个新节点&#xff0c;将新节点和此前节点进行比较&#xff0c;若已经存在则说明已被遍历过&#xff0c;链表有环。 ②快慢指针&#xff1a;创建两个指针&am…...

SaltStack

SaltStack 官方文档 1.简介 作用&#xff1a;批量处理状态管理&#xff08;配置管理&#xff09;事件驱动&#xff08;通过事件触发操作&#xff09;管理私有云/公有云 yum仓库&#xff1a;http://repo.saltstack.com 安装1.master和minionrpm --import https://repo.saltproj…...

【Rust日报】Rust 中的形式验证

文章 - 未来的愿景&#xff1a;Rust 中的形式验证 这篇文章回顾了形式化验证的基本概念&#xff0c;作者展示了如何使用 Hoare triples 来描述和推理程序的正确性&#xff0c;以及如何使用分离逻辑来解决验证的复杂性。文章还解释了为什么 Rust 适用于形式化验证&#xff0c;以…...

vue3项目中新增修改时使用nextTick时遇到的问题

前提 页面是个列表页&#xff0c;需要实现增删改查&#xff0c;新增和修改使用表单提交 关键代码如下 // html部分&#xff0c;新增、修改的表单 <el-dialogv-model"dialogVisible2":title"addTitle"width"600"class"update-shujuji-d…...

算法训练 | 二叉树Part7 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数

目录 530.二叉搜索树的最小绝对差 数组法 双指针法 ⭐ 迭代法 501.二叉搜索树中的众数 双指针法 迭代法 530.二叉搜索树的最小绝对差 题目链接&#xff1a;530. 二叉搜索树的最小绝对差 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 数组…...

C++面向对象程序设计 - 标准输出流

在C中&#xff0c;标准输出流通常指的是与标准输出设备&#xff08;通常是终端或控制台&#xff09;相关联的流对象。这个流对象在C标准库中被定义为std::cout、std::err、std::clog&#xff0c;它们是std::ostream类的一个实例。 一、cout&#xff0c;cerr和clog流 ostream类…...

警惕Mallox勒索病毒的最新变种hmallox,您需要知道的预防和恢复方法。

引言 &#xff1a; 在数字化时代&#xff0c;数据已成为企业和个人最宝贵的资产之一。然而&#xff0c;随着技术的不断发展&#xff0c;网络威胁也日益猖獗&#xff0c;其中.hmallox勒索病毒以其独特的加密手段和狡猾的传播方式&#xff0c;成为了网络安全领域的一颗“隐形炸弹…...

2024年华为OD机试真题-火星文计算-C++-OD统一考试(C卷D卷)

题目描述: 已知火星人使用的运算符为#、$,其与地球人的等价公式如下: x#y = 4*x+3*y+2 x$y = 2*x+y+3 1、其中x、y是无符号整数 2、地球人公式按C语言规则计算 3、火星人公式中,#的优先级高于$,相同的运算符,按从左到右的顺序计算 现有一段火星人的字符串报文,请…...

3.00001 postgres如何初始化系统参数?

文章目录 加载参数整体流程参数结构举例&#xff1a;ConfigureNamesBool 初始化参数 InitializeGUCOptionsbuild_guc_variablesInitializeOneGUCOptionInitializeGUCOptionsFromEnvironment 命令行添加SelectConfigFiles配置 加载参数整体流程 我们先看下guc参数是如何管理的。…...

C# 读取 CSV 文件的方法汇总

文章目录 1. 使用System.IO命名空间中的类2. 处理标题行和指定列3. 使用CsvHelper库4. 高级功能和异常处理5. 使用 LINQ6. 总结 CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔值&#xff09;文件是一种简单的文本文件格式&#xff0c;用于存储表格数据。在C#中&a…...

element+ 引入图标报错 Failed to resolve import “@element-plus/icons-vue“ from “

element 引入图标报错 Internal server error: Failed to resolve import “element-plus/icons-vue” from “src\components\TimeLine.vue”. Does the file exist? 原因&#xff1a;element-plus需要单独引入 icons 文档 pnpm install element-plus/icons-vue之后就可以…...

Github 2024-05-25 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3TypeScript项目3非开发语言项目1HTML项目1Rust项目1Go项目1Jupyter Notebook项目1Java项目1Angular文档:交付Web应用程序的自信之选…...

VPN的详细理解

VPN&#xff08;Virtual Private Network&#xff0c;虚拟私人网络&#xff09;是一种在公共网络上建立加密通道的技术&#xff0c;通过这种技术可以使远程用户访问公司内部网络资源时&#xff0c;实现安全的连接和数据传输。以下是对VPN的详细介绍&#xff1a; 选择代理浏览器…...

java后端轮播图的设计

对于表示轮播图位置这种有限且较小范围的数据&#xff0c;一般可以使用整数类型来表示。考虑到位置序号一般是非负整数且数量较少&#xff0c;可以选择使用小范围的整数类型&#xff0c;如下&#xff1a; 整数类型: 对于Java中&#xff0c;可以考虑使用 int 类型来表示位置序号…...

upload-labs 21关解析

目录 一、代码审计 二、实践 三、总结 一、代码审计 $is_upload false; $msg null; if(!empty($_FILES[upload_file])){//检查MIME$allow_type array(image/jpeg,image/png,image/gif);if(!in_array($_FILES[upload_file][type],$allow_type)){$msg "禁止上传该类型…...

常用汇编指令

&#xff08;arg&#xff09;argument&#xff1a;自变量&#xff0c;变元 &#xff08;reg&#xff09;register&#xff1a;寄存器 &#xff08;seg&#xff09;segment&#xff1a;段寄存器 &#xff08;mem&#xff09;memory&#xff1a;存储器&#xff08;内存单元&am…...

LabVIEW软件需求分析文档内容和编写指南

编写LabVIEW软件需求分析文档&#xff08;Software Requirements Specification, SRS&#xff09;是软件开发的关键步骤之一。以下是详细的内容结构、编写指南和注意事项&#xff1a; 内容结构 引言 项目背景&#xff1a;简要介绍项目背景和目的。 文档目的&#xff1a;说明需…...

spring cache(三)demo

目录 一、入门demo 1、pom 2、配置文件 3、config 4、controller 5、service 6、dao 7、dto与常量 8、测试&#xff1a; 8.1、无参 8.2、单参 &#xff08;1&#xff09;缓存与删除缓存 &#xff08;2&#xff09;删除缓存加入异常 二、自定义删除key 1、pom 2、…...

Android 应用开发语言选择对比

Android开发语言有多种&#xff0c;但是每种语言的各有不同的适用场景&#xff0c;对比介绍如下&#xff1a; 一.首选&#xff1a;原生应用Java&#xff0c;Kotlin 1.截至目前&#xff0c;大约有70%的Android开发者仍然使用Java语言进行开发&#xff0c;而30%的开发者则选择…...

Obsidian加州海岸主题:如何用这款macOS风格主题让你的笔记效率翻倍?

Obsidian加州海岸主题&#xff1a;如何用这款macOS风格主题让你的笔记效率翻倍&#xff1f; 【免费下载链接】obsidian-california-coast-theme A minimalist obsidian theme inspired by macOS Big Sur 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-california-co…...

化学合成革命:5分钟用AI完成复杂分子逆向合成路线设计

化学合成革命&#xff1a;5分钟用AI完成复杂分子逆向合成路线设计 【免费下载链接】aizynthfinder A tool for retrosynthetic planning 项目地址: https://gitcode.com/gh_mirrors/ai/aizynthfinder 你是否曾为设计一个复杂分子的合成路线而彻夜难眠&#xff1f;在传统…...

Solidity 知识点速记整理 - (2026年) (75 - 94)

文章目录前言Solidity 知识点速记整理 - (2026年) (75 - 94)前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那…...

如何快速上手Meeko:分子对接参数化的完整指南

如何快速上手Meeko&#xff1a;分子对接参数化的完整指南 【免费下载链接】Meeko Interface for AutoDock, molecule parameterization 项目地址: https://gitcode.com/gh_mirrors/me/Meeko 想要在药物发现和分子相互作用研究中获得精准的对接结果吗&#xff1f;Meeko作…...

告别客户端安装!浏览器远程控制的终极方案:noVNC实战指南

告别客户端安装&#xff01;浏览器远程控制的终极方案&#xff1a;noVNC实战指南 【免费下载链接】noVNC VNC client web application 项目地址: https://gitcode.com/gh_mirrors/no/noVNC 还在为跨平台远程控制而烦恼吗&#xff1f;还在为每个设备都要安装专用客户端而…...

2026上海楼宇自控系统 / DDC 自控系统/能耗监测系统厂家知名厂家推荐 品牌选型指南!

根据 2026 年最新行业调研数据&#xff0c;楼宇自控市场已迎来深刻变革。在 “双碳” 战略深入推进与国产替代进程加速的双重驱动下&#xff0c;国产品牌已正式跻身行业第一梯队&#xff0c;与霍尼韦尔、江森自控、西门子等国际巨头同台竞技。在此行业格局重组的浪潮中&#xf…...

抖音批量下载神器:douyin-downloader开源工具完整使用指南

抖音批量下载神器&#xff1a;douyin-downloader开源工具完整使用指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback s…...

kagent架构深度解析:4大核心组件如何协同构建云原生AI智能体平台

kagent架构深度解析&#xff1a;4大核心组件如何协同构建云原生AI智能体平台 【免费下载链接】kagent Cloud Native Agentic AI | Discord: https://bit.ly/kagentdiscord 项目地址: https://gitcode.com/gh_mirrors/ka/kagent kagent是一个专为Kubernetes设计的云原生A…...

告别手动肝船!碧蓝航线自动化脚本Alas终极使用指南

告别手动肝船&#xff01;碧蓝航线自动化脚本Alas终极使用指南 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为碧蓝航…...

别再用math.atan了!用NumPy的angle函数处理复数相位,效率提升不止一点点

别再用math.atan了&#xff01;用NumPy的angle函数处理复数相位&#xff0c;效率提升不止一点点 在信号处理、图像分析和科学计算领域&#xff0c;复数相位计算是基础但关键的操作。许多开发者习惯性地使用math.atan(y/x)来计算角度&#xff0c;却不知道NumPy提供的angle()函数…...