Scala--隐式转换

说到隐式转换,不得不说关键字implicit。

》implicit

implicit的三个作用:
- 隐式参数【类似于缺省参数,区别是隐式参数的值可以在方法调用的前的上下文中指定】
- 隐式转换类型
- 隐式调用函数

隐式转换类型

下面是一个普通的函数,当输入参数为Int时,则会报错。

def printString(str) = println(str)

现在对str的内容进行扩展,也就是希望Int,Double等等类型都能够通过这个函数进行打印。
此时需要用到implicit,则可以满足我们的需求了。

implicit def intToString(input:Int) = input.toString
implicit def booleanToString(input:Boolean) = if(input) "true" else "false"

再举一个例子:
简单说明:
从图片中可以看到,类Man和类SuperMan没有任何继承关系。此时假如想用Man类想拥有SuperMan类的“超能力”,则需要通过隐形转换,将Man类视作SuperMan类。
方法一 :
这里写图片描述

方法二 :
方法二更加接近实际生产使用

隐式调用函数

=====

隐式转换的应用
  1. 将当前的类型转换成预期类型,实际使用得并不多。
  2. 类型增强与扩展【重点!使用场景很多】

案例一:ArrayOps对Array的类型增强

一个典型案例是:Scala对Array对象进行的隐式转换。我们知道,Scala通过Predef声明了针对Array类型的两个隐式转换:一个是到ArrayOps的隐式转化,另一个是到WrappedArray的隐式转换。以前者为例,它为Array对象“添加”了大量的操作,这是通过隐式转换来”通明“的对一个类进行增强的典型案例!

案例二:Spark中PairRDDFunctions对RDD的类型增强

如果你看一下Spark中的RDD以及它的子类是没有groupByKey, reduceByKey以及join这一类基于key-value元组的操作的,但是在你使用RDD时,这些操作是实实在在存在的,Spark正是通过隐式转换将一个RDD转换成了PairRDDFunctions, 这个动作是这样发生的:

首先在RDD的伴随对象中声明了从RDD到PairRDDFunctions的隐式转换:

  // The following implicit functions were in SparkContext before 1.3 and users had to
  // `import SparkContext._` to enable them. Now we move them here to make the compiler find
  // them automatically. However, we still keep the old functions in SparkContext for backward
  // compatibility and forward to the following functions directly.

  implicit def rddToPairRDDFunctions[K, V](rdd: RDD[(K, V)])
    (implicit kt: ClassTag[K], vt: ClassTag[V], ord: Ordering[K] = null): PairRDDFunctions[K, V] = {
    new PairRDDFunctions(rdd)
  }

然后在SparkContext中import了RDD的所有东西,使隐式转换生效。

转载于:
http://blog.csdn.net/bluishglc/article/details/50866314

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值