Scala實戰高手****第16課:Scala implicits程式設計徹底實戰及Spark原始碼鑑賞
阿新 • • 發佈:2018-11-21
隱式轉換:當某個類沒有具體的方法時,可以在該類的伴生物件或上下文中查詢是否存在隱式轉換,將其轉換為可以呼叫該方法的類,通過程式碼簡單的描述下 一:隱式轉換 1、定義類Man class Man(val name: String) 2、定義類SuperMan,並在類中定義一個方法 class SuperMan(val name: String) { def makeMiracles = println(this.name + " is super man!") } 3、在main方法中例項化man類,並呼叫makeMiracles方法,這時編譯報錯,提示man中沒有這樣的方法 val man = new Man("Scala") man.makeMiracles // 編譯報錯,提示man中無這樣的方法 4、這時候我們就可以通過隱式轉換的方式將man轉換為SuperMan,這時候就可以呼叫makeMiracles object Man { //隱式轉換 implicit def manToSuperMan(man: Man) = new SuperMan(man.name) } 完整程式碼: class Man(val name: String) class SuperMan(val name: String) { def makeMiracles = println(this.name + " is super man!") } object Man { //隱式轉換 implicit def manToSuperMan(man: Man) = new SuperMan(man.name) } def main(args: Array[String]): Unit = { val man = new Man("Scala") man.makeMiracles } 二:隱式引數 簡單看下程式碼: def talk(name: String)(implicit content: String) { println(name + ":" + content) } 這裡的content就是定義為隱式引數,在呼叫的時候如果定義了隱式變數,則可以不傳content引數 implicit val content = "Money" talk("Spark") //如果上下文沒有定義隱式變數,則需傳兩個引數,也可以傳兩個引數進行覆寫隱式值 talk("Spark")("Scala") //Scala會覆蓋Money 三:隱式類 //隱式類 implicit class sum(x: Int) { def add(y: Int) = x + y } //隱式類 println(3.add(2)) //本身3是沒有add這樣的方法,通過隱式類轉換,就可以實現這樣的功能,主要是看上下文中是否有引數為Int型別的隱式轉換操作 四:隱式物件 示例程式碼: abstract class Template[T] { def add(x: T, y: T): T def unit: T } //隱式物件 object ScalaImplicitObject { implicit object StringAdd extends Template[String] { override def add(x: String, y: String) = x.concat(y) override def unit: String = "" } implicit object IntAdd extends Template[Int] { override def add(x: Int, y: Int) = x + y override def unit: Int = 0 } } 定義sum方法 def sum[T](list: List[T])(implicit t: Template[T]): T = { if (list.isEmpty) t.unit else t.add(list.head, sum(list.tail)) //遞迴呼叫sum } 在main方法中呼叫 import com.dt.scala.ScalaImplicitObject._ //匯入隱式轉換 println(sum(List(1 to 100: _*))) println(sum(List("Spark", "-", "Scala")))