scala 隱式詳解(implicit關鍵字)

掌握implicit的用法是閱讀spark源碼的基礎,也是學習scala其它的開源框架的關鍵,implicit 可分爲:python

  • 隱式參數
  • 隱式轉換類型
  • 隱式調用函數

1.隱式參數

當咱們在定義方法時,能夠把最後一個參數列表標記爲implicit,表示該組參數是隱式參數。一個方法只會有一個隱式參數列表,置於方法的最後一個參數列表。若是方法有多個隱式參數,只需一個implicit修飾便可。 當調用包含隱式參數的方法是,若是當前上下文中有合適的隱式值,則編譯器會自動爲改組參數填充合適的值。若是沒有編譯器會拋出異常。固然,標記爲隱式參數的咱們也能夠手動爲該參數添加默認值。def foo(n: Int)(implicit t1: String, t2: Double = 3.14)markdown

scala > def calcTax(amount: Float)(implicit rate: Float): Float = amount * rate scala > implicit val currentTaxRate = 0.08F scala > val tax = calcTax(50000F) // 4000.0

若是編譯器在上下文沒有找到第二行代碼會報錯框架

2.隱式地轉換類型

使用隱含轉換將變量轉換成預期的類型是編譯器最早使用 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{ def wantLearned(sw : String) = println("兔子已經學會了"+sw) } object swimming{ implicit def learningType(s : AminalType) = new SwingType } class AminalType object AminalType extends App{ import com.mobin.scala.Scalaimplicit.swimming._ val rabbit = new AminalType rabbit.wantLearned("breaststroke") //蛙泳 }

上例中編譯器在rabbit對象調用時發現對象上並無wantLearning方法,此時編譯器就會在做用域範圍內查找能使其編譯經過的隱式視圖,找到learningType方法後,編譯器經過隱式轉換將對象轉換成具備這個方法的對象,以後調用wantLearning方法spa

相關文章
相關標籤/搜索