掌握implicit的用法是閱讀spark原始碼的基礎,也是學習scala其它的開源框架的關鍵,implicit 可分為:
當我們在定義方法時,可以把最後乙個引數列表標記為implicit,表示該組引數是隱式引數。乙個方法只會有乙個隱式引數列表,置於方法的最後乙個引數列表。如果方法有多個隱式引數,只需乙個implicit修飾即可。 當呼叫包含隱式引數的方法是,如果當前上下文中有合適的隱式值,則編譯器會自動為改組引數填充合適的值。如果沒有編譯器會丟擲異常。當然,標記為隱式引數的我們也可以手動為該引數新增預設值。def foo(n: int)(implicit t1: string, t2: double = 3.14)
scala > def calctax(amount: float)(implicit rate: float): float = amount * rate
scala > implicit val currenttaxrate = 0.08f
scala > val tax = calctax(50000f) // 4000.0
如果編譯器在上下文沒有找到第二行**會報錯
使用隱含轉換將變數轉換成預期的型別是編譯器最先使用 implicit 的地方。這個規則非常簡單,當編譯器看到型別x而卻需要型別y,它就在當前作用域查詢是否定義了從型別x到型別y的隱式定義
例子:
scala> val i: int = 3.5 //直接報錯
加上這句:
scala> implicit def double2int(d: double) = d.toint
再執行,沒報錯
scala> val i: int = 3.5 //i=3
3.隱式呼叫函式
隱式呼叫函式可以轉換呼叫方法的物件,比如但編譯器看到x .method,而型別 x 沒有定義 method(包括基類)方法,那麼編譯器就查詢作用域內定義的從 x 到其它物件的型別轉換,比如 y,而型別y定義了 method 方法,編譯器就首先使用隱含型別轉換把 x 轉換成 y,然後呼叫 y 的 method。
例子:
class swingtype
object swimming
class aminaltype
import com.mobin.scala.scalaimplicit.swimming._
val rabbit = new aminaltype
rabbit.wantlearned("breaststroke") //蛙泳
}
上例中編譯器在rabbit物件呼叫時發現物件上並沒有wantlearning方法,此時編譯器就會在作用域範圍內查詢能使其編譯通過的隱式檢視,找到learningtype方法後,編譯器通過隱式轉換將物件轉換成具有這個方法的物件,之後呼叫wantlearning方法 scala學習筆記2 隱式轉換implicit
一 scala隱式轉換 乙個類例項a,有a方法而沒有b方法,需要將a轉換為提供b方法的類,稱為隱式轉換 class richfile val file file object context object helloimplicit 隱式轉換在spark rdd的應用 rddtopairrddfun...
scala隱式詳解
使用implicit關鍵字 implicit val rate float 0.05f implicit def float2int float float 呼叫方法時,如果未輸入隱式引數且 所處作用域中存在型別相容的隱式值,該值會從作用域中調出並被使用,反之,系統將會丟擲編譯器錯誤。def cal...
scala 隱式轉換詳解
隱式轉換的引出,先看一段 隱式轉換的引出 val num int 3.5 double 無法轉成 int 高精度 無法自動轉為 低精度 println s num 概念隱式轉換 以 implicit 關鍵字宣告的,帶有單個引數的函式,這種函式 將會自動應用,將值從一種型別轉為另一種型別 用隱式轉換的...