敏捷硬件开发语言Chisel与数字系统设计 课件 第17章 类型参数化_第1页
敏捷硬件开发语言Chisel与数字系统设计 课件 第17章 类型参数化_第2页
敏捷硬件开发语言Chisel与数字系统设计 课件 第17章 类型参数化_第3页
敏捷硬件开发语言Chisel与数字系统设计 课件 第17章 类型参数化_第4页
敏捷硬件开发语言Chisel与数字系统设计 课件 第17章 类型参数化_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论