天天看點

scala implicit 學習簡記

1 什麼情況下會發生隐式轉化

總的來說就是定義了,用到了。詳細情況用下面幾個例子來示範。

1.1 第一種情況

package com.cma.implicits

import java.io.File

object ImplicitsWhen {

  def main(args: Array[String]): Unit = {

    //定義并導入兩個隐式轉化函數,如果需要,擴充的方法可以直接被file對象使用

    implicit def file2FirstRichFile(file: File) = new FirstRichFile(file)

    implicit def file2SecondRichFile(file: File) = new SecondRichFile(file)

    val file = new File("E:\\hosts.txt")

    //調用第一個隐式轉化

    println(file.readAllLine)

    //調用第二個隐式轉化,然後再調用第一個隐式轉化

    println(file.showAllLine.readAllLine)

  }

  class FirstRichFile(file: File) {

    println("進入FirstRichFile ... ")

    def readAllLine = scala.io.Source.fromFile(file).mkString

  }

  class SecondRichFile(file: File) {

    println("進入SecondRichFile ...")

    def showAllLine = {

      println(scala.io.Source.fromFile(file).mkString)

      //SecondRichFile object 隐式轉化後的對象

      //this

      //File object,隐式轉化之前的對象。目的是進行鍊式操作

      file

    }

  }

}

1.2 第二種情況

package com.cma.implicits

object ImplicitWhenSecond {

  def main(args: Array[String]): Unit = {

    val sqrt = scala.math.sqrt(4)

    println(sqrt)

  }

}

1.3 第三種情況

package com.cma.implicits

object DefaultValue {

  def main(args: Array[String]): Unit = {

    implicit val from : String = "unknown"

    val content : String = "hello,baby!"

    readLetter(content)

  }

  def readLetter(content : String)(implicit from : String) = {

    println(content)

    println(from)

  }

}

package com.cma.implicits

object ClassAsDefaultValue {

  def main(args: Array[String]): Unit = {

    val user = User(1 , "flankwang")

    implicit val livingCost = new LivingCost(850 , 300 , 1500)

    implicit val xxx = "QQ"

    showLivingCost(user)

  }

  def showLivingCost(user : User)(implicit livingCost : LivingCost , xxx : String) = {

    println("使用者 : " + user.name + user.id + "月預算清單 : ")

    println("rent :" + livingCost.rent + ", traffic : " + livingCost.traffic +",food : " +livingCost.food)

    println(xxx)

  }

  case class User(id : Int , name : String)

  case class LivingCost(rent : Int , traffic : Int , food : Int)

}

1.4 第四種情況(context bond使用)

package com.cma.implicits

object ContextBound {

  def main(args: Array[String]): Unit = {

    println(smaller(1)(2))

    println(smaller(new User(1))(new User(2)))

  }

  def smaller[T](first : T)(second : T)(implicit order : T => Ordered[T]) = {

    if(first < second) first else second

  }

  class User(val id : Int ) extends Ordered[User]{

    def compare(that: User): Int = {

      if (this.id < that.id)  1 else if(this.id == that.id) 0 else -1

    }

    override def toString() = {

      "userId : "+ id

    }

  }

}

繼續閱讀