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

本文深入探讨了Scala中的ClassTag、Manifest、ClassManifest和TypeTag的实战应用,特别是在Spark中的广泛使用。在创建泛型函数时,由于Scala在JVM上运行,需要Manifest来指定泛型数组的类型,以实现对Array的实例化。ClassTag作为运行时类信息的标记,解决了编译时无法确定类别的问题。文章通过示例和Spark源码解析,阐述了这些概念的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内容:

1、ClassTagMainfestClassManifestTypeTag实战

2、ClassTagMainfestClassManifestTypeTagSpark中的广泛应用

    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)







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值