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源码鉴赏的更多相关文章

  1. Scala实战高手****第8课:零基础实战Scala最常用数据结构Map和Tuple及Spark源码鉴赏

    本课内容1.Map和Tuple在Spark源码中的鉴赏2.Map和Tuple代码操作实战 ------------------------------------------------------- ...

  2. Scala实战高手****第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏

    /** * 函数式编程进阶: * 1.函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量 * 2.函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称 ...

  3. Scala实战高手****第6课 :零基础实战Scala集合操作及Spark源码解析

    本课内容1.Spark中Scala集合操作鉴赏2.Scala集合操作实战 --------------------------------------------------------------- ...

  4. Scala高手实战****第20课:Scala提取器、注解深度实战详解及Spark源码鉴赏

    Spark中的源码的提取器和注解 @SparkContext.scala @ volatile 线程专用 保证线程间共享内容的一致性 @volatile private var _dagSchedul ...

  5. Scala实战高手****第13课:Scala模式匹配实战和Spark源码鉴赏

    package com.dt.spark.scala.bascis class Dataframework case class Computerframework (name:String,popu ...

  6. Scala实战高手****第7课:零基础实战Scala面向对象编程及Spark源码解析

    /** * 如果有这些语法的支持,我们说这门语言是支持面向对象的语言 * 其实真正面向对象的精髓是不是封装.继承.多态呢? * --->肯定不是,封装.继承.多态,只不过是支撑面向对象的 * 一 ...

  7. Scala高手实战****第19课:Scala的包、继承覆写及Spark源码鉴赏

    1.SparkSession.scala //导入某个类 import scala.beans.Introspector //导入某包下所有的类 import scala.beans._ //导入某包 ...

  8. Scala高手实战****第18课:Scala偏函数、异常、Lazy值编码实战及Spark源码鉴赏

    本篇文章主要讲述Scala函数式编程之偏函数,异常,及Lazy 第一部分:偏函数 偏函数:当函数有多个参数,而在使用该函数时不想提供所有参数(比如函数有3个参数),只提供0~2个参数,此时得到的函数便 ...

  9. Scala实战高手****第16课:Scala implicits编程彻底实战及Spark源码鉴赏

    隐式转换:当某个类没有具体的方法时,可以在该类的伴生对象或上下文中查找是否存在隐式转换,将其转换为可以调用该方法的类,通过代码简单的描述下 一:隐式转换 1.定义类Man class Man(val ...

随机推荐

  1. Planning your upgrade with Upgrade Advisor

    Planning your upgrade with Upgrade Advisor You should use the Upgrade Advisor tool (if it is availab ...

  2. c++ fstream用法

    今天介绍一个复制 粘贴的函数,用fstream实现 #include "stdafx.h" #include<iostream> #include<fstream ...

  3. 转:安装成功的nginx如何添加未编译安装模块

    原已经安装好的nginx,现在需要添加一个未被编译安装的模块 举例说明:安装第三方的ngx_cache_purge模块(用于清除指定URL的缓存) nginx的模块是需要重新编译nginx,而不是像a ...

  4. HDU 1395

    2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  5. DP---背包问题

    http://www.hawstein.com/posts/dp-knapsack.html http://www.cnblogs.com/wwwjieo0/archive/2013/04/01/29 ...

  6. 【洛谷 P1653】 猴子 (并查集)

    题目链接 没删除调试输出,原地炸裂,\(80\)->\(0\).如果你要问剩下的\(20\)呢?答:数组开小了. 这题正向删边判连通性是很不好做的,因为我们并不会并查集的逆操作.于是可以考虑把断 ...

  7. bzoj 1016 深搜

    首先我们知道MST的一些性质,对于这道题来说就是,假设我们先求出一颗MST设为G,由已知边权相同的边最多会有10条,那么假设我们在这10条边中选取size条边∈G,那么我们在这边权相同的边集E中任意选 ...

  8. inno setup 5 添加快捷方式默认选中

    转载:https://www.cnblogs.com/x_wukong/p/5012412.html https://zhidao.baidu.com/question/312006120.html ...

  9. 解决小米/红米手机无法进行jdwp调试的问题

    问题描述:在逆向一个app,研究环境是一台红米2,需要使用jdwp接口,也就是ddms下面这个界面: 但神奇的是,同一台主机上,模拟器的进程可以显示在ddms界面上,红米2确一个进程都没有显示出来.c ...

  10. Java易错知识点(2) - 在读取Cookie时除了Key,Value是得不到其他信息的

    全文总结: 在读取Cookie,然后操作时,除了getName(),getValue()外,不要妄图得到其他信息,如下方法不会得到值的: cookie.getMaxAge(); cookie.getD ...