第15节:scala编程之类型参数

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 Exper
class  Engineer extends Exper
class 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值