一般在开发过程中,也很少用到隐式转换,但在面试中又会经常问到,下面描述下什么是隐式转换?
1. 隐式转换的定义
简单地说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型*
2. 隐式转换的方法
隐式转换完成的方式一般有2种,旧的定义方法指是的“implict def”形式,这种形势下,隐式转换只是一种普通的方法,只不过这种方法要用implicit修饰符修饰,下面以代码举例:
object ImplicitTransTest {
//隐式转换只是一种普通的方法,只不过这种方法要用implici修饰符修饰
implicit def stringToInt(a:String)=a.toInt
def main(args: Array[String]): Unit = {
val a:String = "3"
val b:String = "2"
val c=4
val d =3
println(c/d)
println(a/b) //如果没有隐式转换,字符串"3"/"4"是没有这个方法的,这种运算存在于数字型的运算,而只要在本类中定义了隐式转换或者导入了在其他类定义的隐式转换后,都可以获得该类的方法 在这里添加了隐私转换后 字符串3字段会转换为整形变量3
}
}
3.隐式转换的常见使用场景
3.1 ArrayOps对Array的类型增强
一个典型案例是:Scala对Array对象进行的隐式转换。我们知道,Scala通过Predef声明了针对Array类型的两个隐式转换:一个是到ArrayOps的隐式转化,另一个是到WrappedArray的隐式转换。以前者为例,它为Array对象“添加"了大量的操作,这是通过隐式转换来”通明“的对一个类进行增强的典型案例!这也就是为什么Scala中的Array的功能比Java的数组多得多。
3.2 Spark中PairRDDFunctions对RDD的类型增强
如果你看一下Spark中的RDD以及它的子类是没有groupByKey, reduceByKey以及join这一类基于key-value元组的操作的,但是在你使用RDD时,这些操作是实实在在存在的,Spark正是通过隐式转换将一个RDD转换成了PairRDDFunctions, 这个动作是这样发生的:
object RDDFunctions {
/** Implicit conversion from an RDD to RDDFunctions. */
implicit def fromRDD[T: ClassTag](rdd: RDD[T]): RDDFunctions[T] = new RDDFunctions[T](rdd)
}
首先在RDD的伴随对象中声明了从RDD到PairRDDFunctions的隐式转换:然后在SparkContext中import了RDD的所有东西,使隐式转换生效,这样RDD就具备了键值对型的RDD的功能了。