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,也是一种类型转换系统,在编译的时候,类型信息不够需要借助于JVM的Runtime来通过运行时信息获得完整的类型信息,
* 这在Spark中的是非常重要的!因为Spark的程序的编写和运行是区分了Driver和Executor的,只有在运行时才知道完整的信息。
* 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)
}
}