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
}
}
}