一、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中的泛型代码