频道栏目
首页 > 资讯 > 其他 > 正文

Scala中引入ClassTag 、Manifest、ClassManifest、TypeTag的关系

17-12-26        来源:[db:作者]  
收藏   我要投稿
在Scala中应用了大量的数组,按照Scala的语法来说是不能创建泛型数组,因为Scala编译时必须要确定它的类型,否则编译都不能通过,但是Scala中引入了Manifest,Manifest可以有效解决这个问题
如下图:
 
 
注:如上图中:
当调用方法传递参数执行时,ClassTag会把参数类型记住,其实ClassTag就是隐式值,将类型传递给T,这就是隐式转换最重要的工作
Manifest(上下文界定)特点:
1、Array在Scala中是一个原生的数组,所以编译时并不会有过多的辅助的处理
2、通过Manifest可以创建Array泛型类型的创建,即可以帮助Array提供确认泛型的类型(这就是隐式值)
3、Manifest会存储运行时实际的类型,然后运行时作为参数传递
4、泛型类型在运行时具体的类型是看不到的,被抹掉了
5、隐式是一个难点、重点,隐式是自动判断类型,且进行传递的一个过程
ClassManifest:
和Manifest具有相同的作用,但是获取信息方面比Manifest弱一些
ClassTag :
1、在Spark中的实际编码中ClassTag用的比较频繁,在隐式转换中具有非常重要的作用
2、ClassTag最重要的也是指定在运行时泛型的类型(编译时无法识别的type)
 
综合比较:
1、Manifest有一些弱点,在判断指定路径方面的class的类型时会出现有误,所以用ClassTag代替Manifest,用TypeTag代替ClassManifest
2、TypeTag要比ClassTag更加强大(在实际应用中ClassTag更加广泛)
3、所有在JVM上运行的泛型的类型是被抹掉的,虚拟机根本不知道是什么类型
4、在实际的开发中经常使用上面截图中的第一种方式应用泛型类,但在实际的编译中会形成第二种的方式运行

相关TAG标签
上一篇:什么是内部类?java中内部类的分类及运用实例讲解
下一篇:面向对象加强:自动装箱及自动拆箱
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站