46.ClassTag 、Manifest、ClassManifest、TypeTag代码实战及其在Spark中的应用源码解析

来源:互联网 发布:java数据库连接池写法 编辑:程序博客网 时间:2024/05/22 00:16

一、ClassTag 、Manifest、ClassManifest、TypeTag代码实战


package ce.scala.zhongobject Multiple_Bounds_46 {  def main(args: Array[String]): Unit = {    //常见写法(推荐)    def arrayMake[T : Manifest](first : T, second : T) = {  //创建泛型数组,理论上不可以,因为没有指定具体的类型。运行时,数组必须有具体的类型。     //Array只是Scala的一个普通的类,在虚拟机中,泛型相关的类型信息是被抹掉的。只会有一个arrayMake方法,却要处理所有类型T     //Manifest来帮我们存储运行时的T的具体信息,实际运行时,作为参数用在方法运行的上下文中。当然这个是隐式的过程     //[T : Manifest]是Manifest上下文界定。有这样的隐式值Manifest[T]来辅助构建Array[T],从而确定数组类型         val r = new Array[T](2)      r(0) = first      r(1) = second      r    }        //原始写法(不推荐)    def manif[T](x : List[T])(implicit m : Manifest[T]) = {      if(m <:< manifest[String]) println("List String")   //<:<意思是m是manifest[String]的类型      else println("some other type")    }        manif(List("Spark", "Hadoop")) //会隐式传入Manifest[String]的对象参数    manif(List(1,2))    manif(List("scala", 3))     }}

输出:

List String
some other type
some other type


    class A[T]    val m = manifest[A[String]]    println(m)        val cm = classManifest[A[String]]    println(cm)

输出:

ce.scala.zhong.A[java.lang.String]
ce.scala.zhong.A[java.lang.String]

ClassTag:

    import scala.reflect.ClassTag   //ClassTag最常用    def mkArray[T : ClassTag](elems : T*) = Array[T](elems : _*)     //ClassTag在运行时指定在编译时无法确定的比较high-level级别的类别的信息(不包括static的,但这已经足够了)    //JVM不认识Array[T],只认识Array[Int]或者Array[String]   mkArray(42,13).foreach(println)    mkArray("Chinese", "Germany", "Brazil").foreach(println)

输出:

42
13
Chinese
Germany
Brazil


参考资料来源于大数据梦工厂 深入浅出scala 第46讲 由王家林老师讲解




阅读全文
0 0
原创粉丝点击