第15节:scala编程之类型参数
来源:互联网 发布:绿盾加密软件 编辑:程序博客网 时间:2024/06/05 11:59
package basics/** * sacla类型系统 * 1.scala的类和方法,函数可以是泛型,实例化时指定具体的类型,RDD几乎所有的类型定义都是泛型,因为RDD会派生很多子类 * 通过子类适配了各种不同数据源和业务逻辑 * 2.关于对类型边界的限定分为上边界和下边界: * 上边界:表达了泛型的类型必须是某种类型或者某种类型的子类,语法为<:,这里的一个新的现象是对类型进行限定 * 下边界:表达了泛型必须是某种类型或者其父类,语法为>: * 3.View Bounds,可以进行神秘的转换,把你的类型可以在没有只觉得情况先转换成目标类型,其实可以认为是上边界和下边界加强补充版 * 例如:SparkContext这个spark的核心类中有T<%Writable方式的代码,这个代码所表达的是T必须是Writable类型的,但是 * T没有直接继承Writable接口,此时需要使用“implicit”的方式来实现这个功能 *4.T:ClassTag,例如spark源码中的RDD class RDD[T: ClassTag]这个其实也是一种类型转换系统,只是编译的时候类型信息不够, * 需要借助JVM的runtime来通过运行时信息获得完整的类型信息,在Spark中是非常重要的,因为spark的程序的编程和运行时 * 区分了Driver和Excutorde ,只有在运行的时候才知道完整的类型信息 *5.逆变和协变:-T和+T *6.Context Bounds,T:Ordering这种语法必须能转变成Ordering[T]这种方式 * * */class Experclass Engineer extends Experclass Meeting[-T]//逆变class Mts[+T]//协变class Animal[T](val species: T) { def getanimala(species: T) = println(species) def getanimal(species: T): T = species}class Person(val name: String) { def talk(person: Person) { println(this.name + ":" + person.name) }}class Worker(names: String) extends Person(names)class Dog(val name: String)class Club[T <: Person](p1: T, p2: T) { //下边界 def comunicate = p1.talk(p2)}class Tok[T <% Person](p1: T, p2: T) { //上边界 def comunicate = p1.talk(p2)}class Maximum[T:Ordering](val x:T,y:T){ def bigger(implicit ord:Ordering[T])={//隐式转换 if(ord.compare(x,y)>0) x else y }}object HelloScalaTypeSystem { def main(args: Array[String]): Unit = { implicit def dog2Person(dog: Dog) = new Person(dog.name)//隐式转换 val p = new Person("scala") val w = new Worker("spark") //new Club(p, w).comunicate val dog = new Dog("dahuang") new Tok[Person](w, dog).comunicate //==========第五点========= val e=new Meeting[Engineer]//工程师 participMett(e) val ex=new Meeting[Exper]//专家 participMett(ex) //上面时协变下面时逆变 val mt=new Mts[Exper] Metsor(mt) val nb=new Mts[Engineer] Metsor(nb) println(new Maximum("scala","java").bigger) } def participMett(meeting:Meeting[Engineer]){//逆变 (Exper是Engineer子类) println("逆变") } def Metsor(meeting:Mts[Exper]){//协变 println("协变") }}
阅读全文
0 0
- 第15节:scala编程之类型参数
- 第15课:scala类型参数编程实战及spark源码鉴赏
- 第15课:Scala类型参数编程实战及Spark源码鉴赏
- Scala入门之类型参数
- 第14节:scala编程之集合
- Spark基础-Scala类型参数编程
- Scala之类型参数化:Type Parameterization
- Scala之类型参数化:Type Parameterization
- 第13节:scala编程之模式匹配
- 快学Scala第17章----类型参数
- scala------类型参数
- Scala类型参数
- Scala中的类型参数
- scala类型参数
- Scala类型参数(一)
- Scala类型参数(二)
- 30.scala编程思想笔记——参数化类型
- 56.scala编程思想笔记——类型参数限制
- fragment详解
- C++——操作符重载
- 用yum下载安装gcc
- 深入理解Java虚拟机(8)
- uiautomator点击不同对话框按钮--正则表达式
- 第15节:scala编程之类型参数
- Linux 下的 ActiveMQ C++ 客户端开发
- 一起用C#写个行列式计算器
- hadoop-mapreduce
- 裂墙干货之jieba,wordcloud,nltk下载及安装
- idea创建maven项目
- 20171115_工作记录
- 老杨驴肉馆
- 积极准备(面试)