implicit(隐式转换数据类型)
定义一个变量a,数据类型是Int类型,但是我们赋予的值是3.12,所以它会报错,那么我们现在写一个方法
那么现在就定义成功了,所以这就是隐式转换,编译器自动转换
使用这个命令可以查看Scala中的隐式转换
然后我们开始介绍一下这个implicit隐式
掌握implicit的用法是阅读spark源码的基础,也是学习Scala其他的开源框架的关键。
implicit可以分为:
隐式参数;
隐式转换类型;
隐式类;
1.隐式参数
我们定义了一个say方法,里面的参数是content:String,那么我们在调用方法的时候必须添加参数,如果不添加参数就会报错。
如果我们将这个方法的参数定义为隐式的,即添加关键字implicit,然后我们在main方法中定义一个隐式的变量,那么在调用say方法的时候就可以不再写明参数,编译器会在当前的上下文自动寻找带有implicit关键字,并且数据类型相同的变量作为参数。
但是要注意的是:编译器在查找隐式参数的时候不能有歧义,也就是说不能出现如下的情况,编译器将不知道找哪个:
柯里化之后的隐式参数:
当我们在进行方法的柯里化的时候,会有很多参数,如果方法的参数中有多个隐式参数的话,只需要使用一个implicit关键字即可,隐式参数列表必须放在方法的参数列表后面。
隐式数据转换:
定义了一个隐式转换的方法或者函数
agg是一个Int类型,但是赋值的时候却是一个浮点型,此时编译器会在当前上下文中寻找一个能把浮点类型转换成整数类型的隐式转换,方法可以,函数也可以,这个自动寻找是怎么体现的呢,大家可以看到20.5的下面出现了一个横线,这说明编译器已经找到并将该浮点类型的值转换成了整数类型。如果方法和函数同时存在,那么他会选择用函数转换,因为Scala是面向函数编程,函数是头等的,优先值高于方法。
高级一点的应用,比如:
在JAVA中我们读取一个本地的文件用的是File类,但是这个类里面并没有计算行数的方法,所以我们可以自己写一个类用于计算文件的行数,这个时候我们通常会去new一个我们创建的类的对象,这样就显的没有逼格,那么我们应该怎么做呢?
定义一个隐式方法,将File类型转换成RichFile,而这个RichFile是我们自己写的一个计算行数的类,其代码如下:
RichFile类参数为File类型
隐式类:
注意:隐式类必须在静态对象中使用。也就是object中。
假如我们要放File类具备读文件的功能,那么可以定义一个隐式类
在Scala中也有一个读文件的放大叫做Source.fromFile(file).mkString
这样我们再写一个方法将File类转换成FileReader类就可以了