scala中的隐式转换、隐式参数和隐式类
来源:互联网 发布:同济大学软件学院电话 编辑:程序博客网 时间:2024/06/02 10:07
scala中的隐式转换、隐式参数和隐式类
@(SCALA)[scala]
- scala中的隐式转换隐式参数和隐式类
- 一隐式转换
- 1示例
- 2隐式转换的条件
- 二隐式参数
- 1示例
- 三隐式类
- 1示例
隐式转换是scala的精髓之一,它是一个十分强大的语言特性。
详细可参考《大数据spark企业级实践》最后一部分。
一、隐式转换
当为对象调用某个方法,而这个方法又不是这个对象的方法时,scala会寻找作用范围内的隐式转换来完成这个方法。
1、示例
我们试图给一个Int类型的值赋一个String:
val x: Int = "100"
这肯定是错的,我们应该使用toInt来作转换:
val x: Int = "100".toInt
如果有大量的转换,或者是一些复杂对象的转换,那是不是有点麻烦呢?因此我们定义一个这样的隐式转换函数:
implicit def strToInt(str: String) = str.toInt
只要这个函数在作用域内,则当需要Int值时,String会被自动转变为Int:
scala> implicit def strToInt(str: String) = str.toIntscala> 1+"100"res0: String = 1100scala> def add(x:Int, y: Int) = x + yadd: (x: Int, y: Int)Intscala> add(1,100)res2: Int = 101
注意,Int也能转化为String,因此1+“100”时,结果变为了1100
2、隐式转换的条件
(1)隐式转换必须以单一标识符的形式处于作用域内,或者与转换的源或者目标类型关联在一起。scala编译器将仅考虑作用于作用域之内的隐式转换。简而言之,就是在使用隐式转换之前,需要用import把隐式转换引用到当前的作用域中,或者就在作用域中定义隐式转换。除了隐式转换被引入进当前作用域之外,还有一种方式可以使用隐式转换,就是编译器会在源类型或者期望的伴生对象中寻找隐式定义。
(2)无歧义规则:隐式转换只有在无其它可用转换的前提下才能操作。如果在同一作用域中,对某一源类型定义一个以上的隐式转换函数,且它们都能匹配,那么编译器将报错,所以在使用时请移除不必要的隐式转换。
spark中的RDD调用pariRDDFuntion中定义的方法就是一个典型的隐式转换使用。
二、隐式参数
1、示例
package com.lujinhong.scalaDemoclass ImplicitParameterDemo {}object ImplicitParameterDemo { def testParam(implicit name: String) { println(name) } implicit val name = "lujinhong" def main(args: Array[String]) { testParam("My name") testParam }}
上述示例中将testParam中的参数name设为了implicit,因此当name未赋值时,它会寻找作用域内叫做name的隐式参数所定义的值。有几个注意事项:
* 函数及隐式参数都必须定义为implicit
* 函数中的变量名称必须要隐式参数的名称一致。
* 也可以显式定义函数,如本例中的”My name”,此时隐式参数不生效。
因此,隐式参数与java中的默认参数很类似。
三、隐式类
1、示例
package com.lujinhong.scalaDemo.implicitdemoclass ImplicitClassDemo {}object ImplicitClassDemo { def main(args: Array[String]) { println(2.addOne(1)) println(2.addOne(3)) } implicit class Caculator(x: Int) { def addOne(a: Int): Int = a + 1 }}
隐式类定义中的(x: Int) ,指定了当In这种类型可以在这个隐式类中寻找方法,即这个类中定义的所有方法都会成为Int的隐式函数。
如果想作用于String类型,请看:
package com.lujinhong.scalaDemo.implicitdemoclass ImplicitClassDemo {}object ImplicitClassDemo { def main(args: Array[String]) { println("d".addOne(1)) println("kk".addOne(3)) } implicit class Caculator(x: String) { def addOne(a: Int): Int = a + 1 }}
- scala中的隐式转换、隐式参数和隐式类
- scala中的隐式转换、隐式参数和隐式类
- Scala中的隐式转换、隐式参数、隐式类
- Scala中的隐式转换、隐式参数、隐式类
- scala 隐式转换参数
- Scala中的隐式转换
- Scala中的隐式转换
- Scala隐式转换和隐式参数
- Scala隐式转换和隐式参数
- Scala泛型、隐式转换和隐式参数、视图介绍、Scala中的上界、下界、结合柯里化进行隐式转换
- scala入门-10 隐式转换、隐式参数、隐式类
- scala 隐式转换,隐式参数,隐式类
- scala中的隐式转换之一
- scala中的隐式类型转换
- scala中的隐式转换详解
- Scala--隐式参数
- scala-隐式转换
- scala 隐式转换
- 排序整理
- js 判断时间不能超过3个月
- GUI
- 垃圾收集算法
- ubuntn 17.04 使用总结
- scala中的隐式转换、隐式参数和隐式类
- sass变量
- 贪心,递归,动态规划,及分治算法之间的区别和联系
- Substrings
- python学习笔记
- 如何实现servlet的单线程模式
- 第一次写的linux脚本
- 异或
- 莫比乌斯反演