《scala for the impatient》 隐式转换和隐式参数
所谓隐式转换(implicit conversion function)是以implicit声明的带有单个参数的函数。
它会自动应用,将值从一个类型转到另一种类型。
隐式转化函数可以是任何名称,不需要被显示调用。
1.利用隐式转化丰富现有类库的功能
在scala中可以基于原类型自定义一个经过装饰过丰富过的类型
//为java.io.File 类增加一个read方法 class RichFile(val from: java.io.File) { def read = Source.fromFile(from.getPath).mkString }
然后提供一个隐式转化类将原来的类型转换到新类型
implicit def file2RichFile(from: java.io.File) = new RichFile(from)
测试
package test.scala.lang.implicit_ import scala.io.Source import test.scala.lang.implicit_.RichFile._ //为java.io.File 类增加一个read方法 class RichFile(val from: java.io.File) { def read = Source.fromFile(from.getPath).mkString } object RichFile{ implicit def file2RichFile(from: java.io.File) = new RichFile(from) } object TestImplicit { def main(args: Array[String]): Unit = { test } def test = { val file = new java.io.File("src/main/resources/log4j.properties") println(file.read) } }
2.引入隐式转换
scala会考虑如下的隐式转换函数:
比如上面的
implicit def file2RichFile(from: java.io.File) = new RichFile(from)
位于RichFile的伴生对象中。
在import的时候
不是import test.scala.lang.implicit_.RichFile,这样引入的是伴生对象本身,read方法不能 以单个标识符调用,需要带上类型名称,RichFile.read;
在REPL中,可以通过:implicits 来查看所有除Predef外被引入的隐式成员.
引入隐式转换的 尽量使用局部化的方式,也可以引入单个隐式转换
import test.scala.lang.implicit_.RichFile.file2RichFile
原文:http://www.cnblogs.com/ihongyan/p/4889533.html