Spark(七):scala类型系统编程实战

2018-10-16  本文已影响19人  文子轩

一、泛型的操作

class Animal[T](val species: T) {
  def getAnimal(specie: T)= println(species)
}

通过主函数的调用泛型类并打印出结果。

def main(args: Array[String]): Unit = {
     println( new Animal[String]("wenxuan").getAnimal("123"))
}

二、边界限定

class Person(val name: String) {
  def talk(person: Person): Unit = {
    println(this.name + ":" + person.name)
  }
}
class Worker(name: String) extends Person(name)

定义泛型类

class Club[T <% Person](p1: T, p2: T) { // <% 隐士转换成person
  def comunicte = p1.talk(p2)
}

实例化类,实例化泛型类

val p = new Person("Scala")
val w = new Worker("Spark")
new Club[Person](w, dog).comunicte

三、View Bounds的视图界定

class Dog(val name: String)

class Person(val name: String) {
  def talk(person: Person): Unit = {
    println(this.name + ":" + person.name)
  }
}

定义泛型类

class Club[T <% Person](p2: T, p1: T) { //将T <% 隐士转换成person
 def comunicte = p1.talk(p2)
}

主函数的实现

def main(args: Array[String]): Unit = {
     implicit def dog2Person(dog: Dog) = new Person(dog.name) //把dog转换成person的隐士转换
     val p = new Person("Scala")
     val dog = new Dog("dahuang")
     new Club[Person](w, p).comunicte
|

四、逆变和协变

2、如果 List[A]是 List[B]的子类型,即与原来的父子关系正相反,则称为contravariance(逆变),表达子类可以参加,即父类也可以参加
定义功能类

class Enginner

class Expert extends Enginner

class Meeting[-T]

定义实现函数

  def partitcipateMeeting(meeting: Meeting[Enginner]): Unit = {//协变
def partitcipateMeeting(meeting: Meeting[Eexpert]): Unit = { //逆变

    println("welcome")
  }

主方法的调用

def main(args: Array[String]): Unit = {
     val e = new Meeting[Enginner]
    partitcipateMeeting(e)

    val expert = new Meeting[Expert]
    partitcipateMeeting(expert)
}

五、内容界定

定义功能类

class Maximum[T: Ordering](val x: T, val y: T) {

  def bigger(implicit ord: Ordering[T])={//将ord隐士转换成Ordering的类型
    if(ord.compare(x,y) >0) x else  y //传入的x,y来比较
  }
}

主函数调用方法

def main(args: Array[String]): Unit = {
      println(new Maximum(2,4).bigger)//可以任意类型
}

上一篇 下一篇

猜你喜欢

热点阅读