版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
17.类型参数化一、var类型的字段二、类型构造器三、型变注解四、检查型变注解五、类型构造器的继承关系六、上下界七、方法的类型参数八、对象私有数据目
录
2Why?问题:无法预知对象的类型写新的类工作量巨大解决方法:泛型——类型参数化优点:实例化生成不同的类对象,从而避免了很大的工作量例如:Array[T]、List[T]、Map[T,U]注意:只有类和特质可以进行类型参数化
3一、var类型的字段
4执行两个基本操作:获取字段值或者设置为一个新值编译器会隐式地把这个变量限制成private[this]的访问权限,同时隐式地定义一个名为“变量名”的getter方法,和一个名为“变量名_=”的setter方法classA{
varaInt:Int=_
}
//相当于
classA{
private[this]vara:Int=_
defaInt:Int=a
defaInt_=(x:Int)=a=x
}一、var类型的字段基本介绍
5外部读取和修改var字段转换成对getter和setter方法的调用也可以自定义getter和setter方法,以及一个private[this]修饰的var类型字段字段与方法没有必然联系如果自定义了这两种方法,却不一定要相应的var字段与之对应,这两个方法也可以操作类内的其他成员且可以调用一、var类型的字段基本介绍
6二、类型构造器7泛型的意思就是泛指某种数据类型在scala中,泛型用[数据类型]表示泛型一般是结合数组或者集合来使用泛型主要包括了泛型方法,泛型类以及泛型特质二、类型构造器2.1泛型2.2泛型类泛型类指的是把泛型定义到类的声明上,即类中的成员的参数类型是由泛型来决定的,在创建对象时,明确具体的数据类型class
类[T]
{val
变量名:
T}
8scala>abstractclassA[T]{
|vala:T
|}
classA
scala>defdoesNotCompile(x:A)={}
^
error:classAtakestypeparameters
scala>defdoesCompile(x:A[AnyRef])={}
defdoesCompile:(x:A[AnyRef])Unit二、类型构造器A是一个类,被称为“类型构造器”不能只写一个类名给出具体的类型参数实例
9三、型变注解103.1基本内容A[T]这样的类型构造器,它们的类型参数T可以是协变的、逆变的或者不变的A[+T]表示类A在类型参数T上是协变的A[-T]表示类A在类型参数T上是逆变的类型参数的前缀“+”和“-”被称为型变注解,没有就是不变的三、型变注解
113.2关系图关系变为逆,与原关系反转关系保持不变。没有任何关系,不同类型三、型变注解
12四、检查型变注解13
标注了型变注解的类型参数不能随意使用,类型系统设计要满足“里氏替换原则”里氏替换原则的依据是子类型多态超类的变量可以指向子类的对象,因为子类继承了超类所有非私有成员,能在超类中使用的成员,一般在子类中均可使用四、检查型变注解4.1基本内容
14类型T(超类)类型S(子类)A[T](超类)
A[S](子类)
四、检查型变注解4.2方法中的型变注解vala:A[T]=newA[S]不合法a.funcA(b:T)valc:T=a.funcA()协变类型:合法
15Scala的编译器把类或特质中任何出现类型参数的地方都当作一个点,点有协变点、逆变点和不变点之分,以声明类型参数的类和特质作为顶层开始,逐步往内层深入更深一层的嵌套的点与在包含嵌套的外一层的点被归为一类三种特殊情况:
①方法的值参数所在的点会根据方法外的点进行一次翻转②方法的类型参数也会根据方法外的点进行一次翻转③如果类型也是一个类型构造器,会根据T的注解进行翻转虽然型变注解的检查很麻烦,但这些工作都被编译器自动完成了四、检查型变注解4.3编译器判断规则Q[+U,-T,V]
16五、类型构造器的继承关系17对于单个类型参数的类型构造器而言,继承关系很好判断,只需要看型变注解是协变、逆变还是不变traitFunction1[-S,+T]{
defapply(x:S):T
}五、类型构造器的继承关系5.1单个类型参数S是入参参数,逆变T代表返回值,协变多个类型参数怎么办呢?
18类型A(超类)类型a(子类)类型B(超类)类型b(子类)
5.2多类型参数
Function1[a,B]Function1[A,b]子类结论:把逆变类型参数由子类替换成超类、把协变类型参数由超类替换成子类五、类型构造器的继承关系
19六、上下界206.1上界对于类型构造器A[-T],上界的形式为“U<:T”表示给类型添加一个上界,表示泛型参数必须要从该类(或本身)继承六、上下界
21scala>abstractclassA[-T]{
|deffuncA[U<:T](x:U):U
|}
definedclassA6.2下界对于类型构造器A[+T],下界的形式为“U>:T”表示给类型添加一个下界,表示泛型参数是该类型本身或者类型的超类如果既有下界又有上界。那么下界写在前面,上界写在后面六、上下界
22scala>abstractclassA[+T]{
|deffuncA[U>:T](x:U):U
|}
definedclassA七、方法的类型参数23方法也可以带有类型参数当方法仅仅使用了包含它的类或特质中的类型参数时,那么方法就没必要写出类型参数使用了未声明的类型参数,则必须写在方法的类型参数里七、方法的类型参数不能有型变注解!!不能与已声明的类型参数一样!!
24八、对象私有数据25八、对象私有数据8.1var字段类型参数var类型的字段,类型参数不能是协变的,因为隐式的setter方法需要一个入参类型参数也不能是逆变的,因为隐式的getter方法的返回类型就是字段的类型
26举例:八、对象私有数据scala>classA[-T]{
|vara:T=_
|}
<console>:12:error:contravarianttypeToccurs
incovariantpositionintype=>Tofvariablea
vara:T=_
scala>classA[+T]{
|vara:T=_
}
vara:T=_
^
Online2:error:contravarianttypeToccursincovariantpositionintypeTofvariablea8.1var字段类型参数
27八、对象私有数据scala>classA[-T]{
|private[this]vara:T=_
|}
classA
scala>classA[-T]{
|private[this]vara:T=_
|}
classA如果var字段是对象私有的,即用private[this]修饰,那么它只能在定义该类或特质时被访问。此时gett
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高职化学基础(物质性质)试题及答案
- 2025年高职计算机应用技术(网页制作)试题及答案
- 2025年中职幼儿发展与健康管理(幼儿行为引导)试题及答案
- 2025年高职精细化工技术(精细化工应用)试题及答案
- 2025年中职(生物技术应用)生物制品检测阶段测试题及答案
- 2025年中职旅游管理(旅游线路设计)试题及答案
- 2025年中职车辆维修(轮胎保养与检测)试题及答案
- 2026年注册消防工程师一级(消防安全案例分析)试题及答案
- 2025年高职广告电子屏信息安全管理(风险防控措施)试题及答案
- 2026年广州体育职业技术学院高职单招职业适应性测试备考题库带答案解析
- 2025年部编版道德与法治六年级上册全册教案设计(共4个单元含有教学计划)
- 2025-2030中国电动警用摩托车和应急摩托车行业市场现状供需分析及投资评估规划分析研究报告
- 农机安全操作培训课件
- 企业所得税纳税申报表(2024年修订)填报要点及相关政策分析
- 课程设计说明书
- 2025年中国纳秒紫外激光器行业市场运行现状及投资规划建议报告
- 房屋租赁合同(附房屋交割清单)
- 奥特曼涂色画简笔画直接打印版A4
- 小学五年级上册英语(外研一起)期末模拟测试卷(一)
- 2022浪潮信创服务器CS5260H2技术白皮书
- 成品保护图册
评论
0/150
提交评论