Scala高级语法系列之隐式转换

  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的隐式参数。
  注意:

  1. 如果上下文中出现两个符合要求的隐式参数,则会抛出异常。
  2. 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())
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章