第46讲:ClassTag 、Manifest、ClassManifest、TypeTag代码实战及其在Spark中的应用源码解析学习笔记

46讲:ClassTag ManifestClassManifestTypeTag代码实战及其在Spark中的应用源码解析学习笔记

应用最多的是classTag,其次是TypeTag.

 

实例代码:

创建数组,理论上讲创建泛型数组是不可以的,因为没有指定具体类型。

scala中运行时数组必须有具体类型。

引入manifest后就可以创建泛型数组

 

1

def arrayMake[T: Manifest](first : T, second : T) = {

  val r = new Array[T](2);r(0) = first; r(1) = second; r

  /*T: ManifestT的上下文界定。有一个ManifestT类型的隐式值,这个过程是隐式转换的过程。

  *有这样的隐式值辅助我们构建Array[T],从而确定T的类型。

  *编写代码及编译时并不知道T的具体类型。

  *manifast是上下文界定,其实是假设T是整数,Array[T]就是Array[Int]  */

}

arrayMake(1,2).foreach(println)

//要构建泛型对象,需要manifest来存储T的实际类型,

//在实际运行时,是作为参数用地方法运行的上下文中。

//是个隐式的过程,manifest可以记录T的具体类型,所以就可以获取它的类型。

 

2

def manif[T](x: List[T])(implicit m : Manifest[T]) = {

  //implicit m : Manifest[T]是个隐式参数,是虚拟机运行时传入的。

  if (m <:< manifest[String])

  //<:<下节再讲,mmanifest[String]类型的。

    println("List string")

  else

    println("Some other type")

}

manif(List("Spark","Hadoop"))

manif(List12))

manif(List("Scala",3))

2的写法有点繁琐,所以推荐例1的写法,例1是简化写法,内部自动构建隐式参数。

 

3

val m = manifest[A[String]]

println(m)

val cm = classManifest[A[String]]

println(cm)

 

classManifestManifest信息获取方面弱。

manifest本身是有问题的。

依赖路径与实际类型判断有误。

所以又推出typeTagclassTag取代manifestclassManifest

spark源码中大部分都是lassTagtypeTag

 

4

import scala.reflect.ClassTag

def mkArray[T: ClassTag](elems: T*) = Array[T](elems: _*)

  mkArray(42,13).foreach(println)

  mkArray("Japan",Brazil","Germany").foreach(println)

 

编写编译时不需要具体类型,运行时必须要有具体类型。

原因:scala运行在jvm虚拟机上,虚拟机运行任何对象时对象是泛型时是把泛型擦除掉的。

 

以上内容是从王家林老师DT大数据课程第46讲的学习笔记。
DT大数据微信公众账号:DT_Spark  

王家林老师QQ:1740415547 

王家林老师微信号:18610086859
我的百度网盘共享的DT大数据梦工厂王家林老师第1-90讲的视频内容:http://pan.baidu.com/s/1qWK9CMo

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值