Scala隐式转换可分为三种类型:隐式参数、隐式类型转换、隐式类。其中,隐式类只能定义在单例对象/伴生对象中,笔者还没想到很好的使用场景,本篇不做案例。
案例一、隐式参数
package basic
object ImplicitParameter extends App {
def add(a:Int)(implicit b:Int,c:Int) = a + b + c
implicit val a = 2;
//implicit val b = 3;
println(add(1))
}
上述add方法属于柯里化高阶方法,参数b和c被implicit关键字修饰,在执行期间,编译器会在上下文中寻找类型为Int的隐式参数。
注意:
- 如果上下文中出现两个符合要求的隐式参数,则会抛出异常。
- add方法的形参,implicit只能修饰最后一个括号中的参数,否则编译不过。
案例二、隐式类型转换
隐式类型转换,可以很方便的增强类的功能,如下案例,java.io.File并没有提供count方法,我们可以通过该方式,给File类提供count功能。(有点儿装饰器模式的味道)
/**
File装饰类
*/
class AdvancedFile(file:File){
/*
val count = ()=>{
Source.fromFile(file).getLines().length
}*/
def count()={
val input = new BufferedReader(new InputStreamReader((new FileInputStream(file))))
input.lines().count()
}
}
object ImplicitDemo extends App{
val file = new File("/Users/chenyuedong/Desktop/IT/test/familyname.pages")
println(file.exists())
implicit def fileToAdvancedFile(file:File) = new AdvancedFile(file)
println(file.count())
}