[筆記遷移][Spark開發語言][Scala][9]隱式轉換與隱式引數
阿新 • • 發佈:2018-11-19
一、概述
- 其功效類似於SpringMVC中DataBind中呼叫的ConversionService(Converters)
- 最核心的任務是定義隱式轉換函式(函式!!!函式!!!),即implicit conversion function
- 定義的隱式轉換函式,只要在程式內引入,就會被Scala自動使用。
當程式中使用到隱式轉換函式所接收的引數型別的物件時,Scala會自動將其傳入隱式轉換函式,轉換為另一種型別的物件並返回 - 隱式轉換函式叫什麼名字是無所謂的,因為通常不會由使用者手動呼叫,而是由Scala自動呼叫。但如果要使用隱式轉換,則需要對隱式轉換函式進行匯入。因此通常建議將隱式轉換函式命名為"xxx2yyy"的形式
二、如何進行隱式轉換
- 要實現隱式轉換,只要在程式可見範圍內定義隱式轉換函式即可
- 隱式轉換函式於普通函式的唯一語法區別:以implicit開頭,且必須宣告函式的返回型別
三、使用隱式轉換增強現有型別(裝飾模式)
四、匯入隱式轉換函式的作用域
-
Scala預設使用兩種隱式轉換
(1)源型別或目標型別的伴生物件中宣告的隱式轉換函式
(2) 當前程式作用域內可用唯一識別符號確定的隱式轉換函式 -
如果隱式轉換函式不在上述預設位置的話,就必須手動import匯入某個包下的隱式轉換函式
-
通常建議:僅在需要進行隱式轉換的地方(如函式體或方法體內)用import匯入隱式轉換函式以縮小隱式轉換函式作用域,避免不必要的型別轉換
五、隱式轉換的發生時機
- 呼叫某個函式,但傳入的實參型別於定義的形參型別不匹配
- 使用某個物件呼叫其類中不存在的方法
- 使用某個型別的物件,呼叫某個方法,雖然該類中存在該方法,但傳入的實參型別與定義的形參型別不匹配
六、隱式引數(類DI)
-
隱式引數,是指在函式或方法內,定義一個用implicit修飾的引數,此時Scala會嘗試找到一個指定型別的,用implicit修飾的隱式值進行注入
-
查詢範圍:
(1) 當前作用域內可見的val或var定義的隱式變數
(2) 隱式引數型別的伴生物件內的隱式值
(3) 案例