以前有看過kafka源碼,有不少implict聲明的方法,當時看的一頭霧水,今天趁着空閒,瞭解下scala 的隱式轉換和柯理化相關語法知識.java
須要類中的一個方法,可是這個類沒有提供這樣的一個方法,因此咱們須要隱式轉換,轉換成提供了這個方法的類,而後再調用這個方法json
import java.io.File import scala.io.Source class RichFile(val file: File) { def read = { Source.fromFile(file.getPath).mkString } } object Context { implicit def file2RichFile(file: File) = new RichFile(file) } object Hello_Implicit_Conversions { def main(args: Array[String]): Unit = { import Context.file2RichFile println(new File("/Users/mac/Downloads/Kafka.json").read) } }
總體流程看下圖:函數
隱式參數與隱式值oop
兩種用法搭配起來來達到一個效果,隱式參數代表這個參數是能夠缺乏的,也就是說在調用的時候這個參數能夠不用出現,那麼這個值由什麼填充呢? 那就是用隱式的值了,如下的例子說明了這一點:scala
object Context_Implicits { //隱式值 implicit val default: String = "Java" } object Param { //函數中用implicit關鍵字 定義隱式參數 def print (context: String) (implicit language: String) { println(language + ":" + context) } } object Implicit_Parameters { def main(args: Array[String]): Unit = { //隱式參數正常是能夠傳值的,和普通函數傳值同樣 可是也能夠不傳值,由於有缺省值(默認配置) Param.print("Spark")("Scala") import Context_Implicits._ //隱式參數沒有傳值,編譯器會在全局範圍內搜索 有沒有implicit String類型的隱式值 並傳入 Param.print("Hadoop") } }
implicit class 隱式類code
implicit class MyClass(x: Int)
做用:對象
這裏的做用主要是其主構造函數能夠做爲隱式轉換的參數,至關於其主構造函數能夠用來當作一個implicit的function,下面舉例說明一下:blog
object Test extends App { implicit class MyName(x: Int) { println("im in cons") val y = x } def say(x: MyName) = { println(x.y) } say(5) }
輸出結果:ci
im in cons 5
這裏的MyName是一個隱式類,其主構造函數能夠用做隱式轉換,因此say須要一個MyName類型的參數,可是調用的時候給的是一個Int,這裏就會調用MyName的主構造函數轉換爲一個MyName的對象,而後再println其y的值get
柯里化指的是將一個接收多個參數的函數分解成多個接收單個參數的函數的一種技術。
好比說有這樣一個普通的函數
def minus(x: Int, y: Int) = x - y
柯理化後就變成如下形式,一個減法操做被分割爲兩部分
def minusCurrying(x: Int)(y: Int) = x - y
調用以上兩個函數
minus(5, 3) minusCurrying(5)(3)
隱式(IMPLICIT)參數
若是要指定參數列表中的某些參數爲隱式(implicit),應該使用多參數列表。例如:
def execute(arg: Int)(implicit ec: ExecutionContext) = ???