Scala基础—*类型参数编程实战示例

package com.spark.scala.basics

/**
  * 1.scala的类和方法、函数都可以是泛型
  * 2.对类型边界的限定,分为上边界和下边界:
  * 上边界:表达了泛型的类型必须是某种类型或者该类型的子类,语法为<:,对类型的限定
  * 下边界:表达了泛型的类型必须是某种类型或者该类型的父类,语法为>:,对类型的限定
  * 3.View Bounds:是上边界和下边界的加强补充版本,语法为<%
  * Spark核心类SparkContext中有T <% Writable方式的代码,这个代码的意思是T必须是Writable类型的,但是T没有直接继承自Writable接口,
  * 此时就需要通过"implicit"的方式来实现这个功能
  * 4.T: ClassTag,Spark中源码中的RDD,也是一种类型转换系统,在编译的时候,类型信息不够需要借助于JVMRuntime来通过运行时信息获得完整的类型信息,
  * 这在Spark中的是非常重要的!因为Spark的程序的编写和运行是区分了DriverExecutor的,只有在运行时才知道完整的信息。
  * 5.逆变和协变:-T+T
  * 6.Context Bounds, T: Ordering这种语法必须能够变成Ordering[T]这种方式
  */

//逆变和协变
class Engineer
class Expert extends Engineer

class Meeting[+T]

//Context Bounds
class Maximum[T: Ordering](val x : T, val y : T) {
  def bigger(implicit ord : Ordering[T]) = {
    if (ord.compare(x, y) > 0) x else y
  }
}

class Animal[T](val species: T) {
  //类泛型
  def getAnimal(species: T) = println(species) //方法泛型
}

object TypeSystem {
  def main(args: Array[String]): Unit = {
/*    //没有继承自Person
    implicit def dog2Person (dog: Dog) = new Person(dog.name)
    val p = new Person("Scala")
    val w = new Worker("Spark")
    val dog = new Dog("XiaoHua")
    //    new Club(p, w).communicate
    new Club[Person](p, dog).communicate //指定泛型的界定[Person]*/

    //逆变和协变
    val e = new Meeting[Engineer]
    participateMeeting(e)

    val expert = new Meeting[Expert]
    participateMeeting(expert)

    //Context Bounds
    println(new Maximum("Scala", "Java").bigger)

  }

  def participateMeeting(meeting: Meeting[Engineer]): Unit = {
    println("Welcome ")
  }

  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 Club[T <: Person](p1: T, p2: T) {  //边界限定:上边界
  //  def communicate = p1.talk(p2)
  //}

  // View Bounds
  class Dog(val name: String)


  class Club[T <% Person](p1: T, p2: T) {
    //边界限定:上边界
    def communicate = p1.talk(p2)
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值