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 ...
随机推荐
- eclipse web(Spring+SpringMVC+Hibernate)项目迁移至intellij idea
1.导入Eclipseweb项目 跟着导航一直下一步 出现警告不要担心,先点击确认,到后面再进行设置jdk 成功导入项目后如下图 2.对导入的项目进行配置按Ctrl+shift+alt+s(或下图中的 ...
- DecimalFormat中格式化问题
一:前言 每天自己斗会看到新的东西,每天自己都会学到东西,但是觉得自己老是想一口吃一个胖子.每天看到一个知识点都把其收藏了,但是自己也没有时间去看,不知道自己到底想感谢什么.真是自己无语,本来说是把自 ...
- js事件中绑定另一事件导致事件多次执行
1.html代码 <input type="button" value="add"> <input type="button&quo ...
- QML与C++混合编程详解(转)
原文转自:http://blog.csdn.net/ieearth/article/details/42243553 原文转自:https://www.cnblogs.com/findumars/p/ ...
- exec,eval
一.什么是Exec语句 假如我们一串字符串里面有Python代码,这个时候,普通情况是会把这串代码作为字符串来输出的,而不会执行这段代码.如果此时,我们想执行这串字符串里面的python代码,使用Ex ...
- HTML5-坦克大战一画出敌人坦克并让自己的坦克可以发子弹的功能(二)
上一篇博客只画出了,一个坦克,并让其可以上下左右移动,这篇博客将画出敌人的坦克,并让自己的坦克可以发子弹,但是还不是尽善尽美,还有一些问题,将会在下篇博客说明: html代码: <!DOCTYP ...
- Spring+Junit,测试事务时,一直回滚
研究了好长时间,都不知道原因,也不能解决. 控制台又没有报异常,但是就是一直回滚.注释掉spring声明式配置的代码,就能正确的更新数据. 从网上看了,别人的文章 http://blog.csdn.n ...
- 安装cuda8.0时出现错误:Missing recommended library: libGLU.so Missing recommended library: libGL.so
安装cuda8.0时出现错误: Missing recommended library: libGLU.soMissing recommended library: libGL.so Installi ...
- background-clip,origin属性
background-clip是新增属性之一,其作用是确定背景的裁剪区域. background-clip语法: background-clip:margin-box | padding-box | ...
- 网站js埋点
js埋点 1.埋点作用: 页面埋点的作用:其实就是用于流量分析.而流量的意思,包含了很多:页面浏览数(PV).独立访问者数量(UV).IP.页面停留时间.页面操作时间.页面访问次数.按钮点击次数.文 ...