内容:
1、ClassTag、Mainfest、ClassManifest、TypeTag实战
2、ClassTag、Mainfest、ClassManifest、TypeTag在Spark中的广泛应用
def arrayMake[T : Manifest](first : T, second : T) = {
val r = new Array[T](2); r(0) = first; r(1) = second; r
}
arrayMake(1,2).foreach(println)
在创建泛型函数的时候需要Manifest,帮助完成对泛型数组的创建,借助Manifest对象来指定泛型数组Array的类型,使用Manifest来帮我们存储泛型的实际类型,其实一个隐式过程。
def manif[T](x: List[T])(implicit m: Manifest[T]) = {
if (m <:< manifest[String])
println("List strings")
else
println("Some other type")
}
def arrayMake[T : Manifest](first : T, second : T) = {
val r = new Array[T](2); r(0) = first; r(1) = second; r
}
arrayMake(1,2).foreach(println)
//泛型函数需要具体类型,Manifest实际为Mainfest[T],所以可以根据运行时的状态arrayMake(1,2)为整数,所以将T赋值为整数类型,继而可以new Array。
ClassTag:
def mkArray[T : ClassTag](elems: T*) = Array[T](elems: _*)
mkArray(42, 13).foreach(println)
mkArray("Japan","Brazil","Germany").foreach(println)
//Scala是运行在JVM虚拟机上的,所以编译器对于泛型Array[T]不认识,就需要转化为具体类型如Array[Int]、Array[String]等,ClassTag是在运行时指定在编译的时候无法确定的类别的信息。
def main(args: Array[String]) {
val triple = new Triple("Spark", 3, 3.1415)
val bigData = new Triple[String, String, Char]("Spark", "Hadoop", 'R')
def getData[T](list : List[T]) = list(list.length / 2)
println(getData(List("Spark", "Hadoop", 'R')))
val f = getData[Int] _
println(f(List(1,2,3,4,5,6)))
val queue = Queue(1,2,3,4,5)
val queue_appended = queue enqueue 6
println("queue : " + queue + " " + "queue_appended : " + queue_appended)