Scala实战高手****第15课:Scala类型参数编程实战及Spark源码鉴赏
1、Scala的类和方法、函数都可以是泛型
2、上界:表示泛型的类型必须是某种类型或者其类型的子类,语法:<: ,对类型进行限定
3、下界:表示泛型的类型必须是某种类型或者其类型的父类,语法:>:
4、View Bounds,可以进行隐式转换,将其转换成目标类型,是上边界和下边界的加强版,
语法 T <% U,T必须是U的类型,但是又没有直接继承自U,所以要通过隐式转换操作
5、T:ClassTag,一种类型转换,编译的时候类型不够,需要通过JVM的runtime来通过运行时的获取信息
6、逆变和协变,语法:-T和+T,-T:子类能参加,父类也能参加(逆变), +T:父类能参加,子类也能参加:(协变)
/**
* 描述:Scala参数类型
* 作者: sunrunzhi
* 时间: 2018/11/21 18:42
*/
class Person(val name:String){ def talk(person: Person): Unit ={
println(this.name+" is talking to "+person.name)
}
} class Worker(name:String) extends Person(name)
class Dog(val name:String) class Club[T<:Person](p1:T,p2:T){
def communicate=p1.talk(p2)
} class Club2[T<%Person](p1:T,p2:T){
def communicate=p1.talk(p2)
} object C15 { def main(args: Array[String]): Unit = {
implicit def dog2Person(dog:Dog)=new Person(dog.name)
val p=new Person("张三")
val t=new Worker("李四")
val g=new Dog("大黄")
new Club(t,p).communicate
new Club2[Person](t,g).communicate } }
package com.wanji.scala.test /**
* 描述:Scala参数类型
* 作者: sunrunzhi
* 时间: 2018/11/21 18:42
*/
class Person(val name:String){ def talk(person: Person): Unit ={
println(this.name+" is talking to "+person.name)
}
} class Worker(name:String) extends Person(name)
class Dog(val name:String) class Club[T<:Person](p1:T,p2:T){
def communicate=p1.talk(p2)
} class Club2[T<%Person](p1:T,p2:T){
def communicate=p1.talk(p2)
} class A
class AA extends A
class AAA extends AA class Meeting[+T]//协变
class Yeeting[-T]//逆变 object C15 { def ByMeeting(meeting: Meeting[AA]): Unit ={
println("协变")
} def ByYeeting(meeting: Yeeting[AA]): Unit ={
println("逆变")
} def main(args: Array[String]): Unit = { ByMeeting(new Meeting[AAA]())
ByYeeting(new Yeeting[A]()) implicit def dog2Person(dog:Dog)=new Person(dog.name)
val p=new Person("张三")
val t=new Worker("李四")
val g=new Dog("大黄")
new Club(t,p).communicate
new Club2[Person](t,g).communicate } }
Scala实战高手****第15课:Scala类型参数编程实战及Spark源码鉴赏的更多相关文章
- Scala实战高手****第8课:零基础实战Scala最常用数据结构Map和Tuple及Spark源码鉴赏
本课内容1.Map和Tuple在Spark源码中的鉴赏2.Map和Tuple代码操作实战 ------------------------------------------------------- ...
- Scala实战高手****第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
/** * 函数式编程进阶: * 1.函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量 * 2.函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称 ...
- Scala实战高手****第6课 :零基础实战Scala集合操作及Spark源码解析
本课内容1.Spark中Scala集合操作鉴赏2.Scala集合操作实战 --------------------------------------------------------------- ...
- Scala高手实战****第20课:Scala提取器、注解深度实战详解及Spark源码鉴赏
Spark中的源码的提取器和注解 @SparkContext.scala @ volatile 线程专用 保证线程间共享内容的一致性 @volatile private var _dagSchedul ...
- Scala实战高手****第13课:Scala模式匹配实战和Spark源码鉴赏
package com.dt.spark.scala.bascis class Dataframework case class Computerframework (name:String,popu ...
- Scala实战高手****第7课:零基础实战Scala面向对象编程及Spark源码解析
/** * 如果有这些语法的支持,我们说这门语言是支持面向对象的语言 * 其实真正面向对象的精髓是不是封装.继承.多态呢? * --->肯定不是,封装.继承.多态,只不过是支撑面向对象的 * 一 ...
- Scala高手实战****第19课:Scala的包、继承覆写及Spark源码鉴赏
1.SparkSession.scala //导入某个类 import scala.beans.Introspector //导入某包下所有的类 import scala.beans._ //导入某包 ...
- Scala高手实战****第18课:Scala偏函数、异常、Lazy值编码实战及Spark源码鉴赏
本篇文章主要讲述Scala函数式编程之偏函数,异常,及Lazy 第一部分:偏函数 偏函数:当函数有多个参数,而在使用该函数时不想提供所有参数(比如函数有3个参数),只提供0~2个参数,此时得到的函数便 ...
- Scala实战高手****第16课:Scala implicits编程彻底实战及Spark源码鉴赏
隐式转换:当某个类没有具体的方法时,可以在该类的伴生对象或上下文中查找是否存在隐式转换,将其转换为可以调用该方法的类,通过代码简单的描述下 一:隐式转换 1.定义类Man class Man(val ...
随机推荐
- 简单配置oracle11g
一.配置 Systemd file(开机可以自动oracle,也可以查看启动状态) a.定义环境变量 [oracle@ol7 ~]$ cat /etc/sysconfig/DB11G.oracledb ...
- Java并发(8)- 读写锁中的性能之王:StampedLock
在上一篇<你真的懂ReentrantReadWriteLock吗?>中我给大家留了一个引子,一个更高效同时可以避免写饥饿的读写锁---StampedLock.StampedLock实现了不 ...
- Drupal7导入语言包
下载语言包 然后把包存放在profiles\standard\translations目录下,安装. 如果出现如下错误 1.错误有MySql数据库默认引擎innoDB引起,只要mysql\bin\my ...
- python3 正则表达式re模块
正则表达式的功能:字符串的模糊匹配查询import re元字符 . ---->匹配除换行符意外的任意字符 ^ ---->匹配行首位置 $ ---->匹配行尾位置 关于重复的元字符 * ...
- mysql五:数据操作
一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...
- Cpython解释器支持的线程
因为Python解释器帮你自动定期进行内存回收,你可以理解为python解释器里有一个独立的线程,每过一段时间它起wake up做一次全局轮询看看哪些内存数据是可以被清空的,此时你自己的程序 里的线程 ...
- jQuery,月历,左右点击事件实现月份的改变
html页面: <div class="recordbriefing-title-top-body"> <span class="record-left ...
- 几个很好的OJ网站
很友好的OJ网站(OJ是open judge,在线评测) POJ 北京大学ACM ZOJ 浙江大学ACM WOJ 武汉大学ACM(一个题目提交通过后,可以查看通过该题的所有代码) 唯一不好的地方是题 ...
- 使用chardet模块判断网页编码
import chardet import urllib.request url='http://stock.sohu.com/news/' html = urllib.request.urlopen ...
- python 九九乘法表
for i in range(1,10): for j in range(1,i+1): print('%d x %d = %d\t' %(j, i, j*i),end="") p ...