42.Scala中泛型类、泛型函数、泛型在Spark中的广泛应用

时间:2021-01-08 19:24:48

一、Scala中的泛型类代码实战

sealed abstract class List[+A] extends AbstractSeq[A]
with LinearSeq[A]
with Product
with GenericTraversableTemplate[A, List]
with LinearSeqOptimized[A, List[A]]
with Serializable {...}
泛型:定义时没指明具体类型,使用时才指明

List的泛型是A,那么它继承的抽象类和接口的泛型都是A


二、Scala中泛型函数代码实战

class Triple[F,S,T](val first : F, val second : S, val third : T)


object Hello_Type_42 {

def main(args: Array[String]): Unit = {

val triple = new Triple("spark", 8, 8.3) //这里并没有指明泛型类型,但是scala会根据实际传入的类型来推导出泛型的类型
val t1 = new Triple[String, String,Char]("ni", "d",'a') //括号里的元素类型只能是我们规定的类型或其子类

//泛型函数
def getData[T](list : List[T]) = list(list.length/2)
    println(getData(List("spark","hadoop","scala")))
    val f = getData[Int] _
    println(f(List(1,2,3,4,5,6,7,8,9)))


def foo[A,B](f : A => List[A], b: A) = f(b) //这里b必须是A类型


 }
}
输出:

hadoop
5

自己定义一个泛型类Triple

通过类型推导 + 隐式转换,可以写出表达力很强、很简洁的语句


四、ClassTag

class Triple[F : ClassTag ,S,T](val first : F, val second : S, val third : T)

ClassTag添加了更多上下文信息,在运行时,可以根据运行时这个泛型类传递来的具体数据来提供更多信息


三、Scala中的泛型在Spark中的广泛应用

可以参考Spark中RDD中的泛型代码