你好,游客 登录
背景:
阅读新闻

Scala+Spark大数据编程入门教程(005)-神奇的Scala隐式转换

[日期:2018-09-11] 来源:www.bigdatastudy.net  作者:艾叔 [字体: ]

Scala的隐式转换可以说是Scala语言中很神奇的一个功能,我们先来看一个例子。

1.隐式转换示例

首先声明一个Int类型变量num,赋值为10

scala> val num:Int = 10

然后调用num中的max方法,用于和其它数值比较大小。

scala> num.max(20)

res2: Int = 20

scala> num.max(5)

res3: Int = 10

问题:numInt类型,但Int class中,并没有max方法,那这个max是来自哪呢?

ScalaREPL中输入下面的命令

scala> :implicits -v

可以看到下面这行声明

implicit def intWrapper(x: Int): runtime.RichInt

具体的实现是如下

implicit def intWrapper(x: Int) = new runtime.RichInt(x)

这就告诉Scala,如果num:Int中没有max方法,将查找所有输入是Int的隐式转换函数,看该函数所返回的对象中是否有max方法,如果有,则用该对象的max方法来作为num.max,在这里RichInt中有max方法,所以:num.max(20)就等于RichInt(num).max(20)

2.隐式转换要注意的地方

1)隐式转换只与输入参数、返回值有关,和函数名称无关,例如上面的函数名是intWrapper,换成其它的名字不影响;

2)不同的隐式转换中,其输入参数的类型和返回值不能都相同,否则会冲突,例如,要再定义一个下面的隐式转换函数intWrapper02,就会冲突;

implicit def intWrapper02(x: Int) = new runtime.RichInt(x)

 3.总结

1)Scala隐式转换包括:隐式转换函数、隐式转换参数、隐式转换class三种,本文介绍的是隐式转换函数的例子;

2)Scala隐式转换在扩展类库接口是很有用,通过隐式转换函数,可以实现在对类库不做任何修改的情况下,扩展类库的接口,这样,即使没有源码,也能很方便地进行扩展。

 

原创文章,转载请注明: 转载自大数据学习网,作者:艾叔

本文链接地址

艾叔:Scala+Spark大数据编程入门教程(001-ScalaJava比较、Scala对于初学者的缺点?

艾叔:Scala+Spark大数据编程入门教程(002-ScalaSpark的关系、Spark为什么用Scala来开发?

艾叔:Scala+Spark大数据编程入门教程(003-Scala常用数据类型、范围、及范围查看方法

艾叔:Scala+Spark大数据编程入门教程(004-ScalaSpark经典入门书籍推荐

艾叔:Scala+Spark大数据编程入门教程(005-神奇的Scala隐式转换

 

收藏 推荐 打印 | 阅读: