1. 程式人生 > >[筆記遷移][Spark開發語言][Scala][9]隱式轉換與隱式引數

[筆記遷移][Spark開發語言][Scala][9]隱式轉換與隱式引數

一、概述

  1. 其功效類似於SpringMVC中DataBind中呼叫的ConversionService(Converters)
  2. 最核心的任務是定義隱式轉換函式(函式!!!函式!!!),即implicit conversion function
  3. 定義的隱式轉換函式,只要在程式內引入,就會被Scala自動使用
    當程式中使用到隱式轉換函式所接收的引數型別的物件時,Scala會自動將其傳入隱式轉換函式,轉換為另一種型別的物件並返回
  4. 隱式轉換函式叫什麼名字是無所謂的,因為通常不會由使用者手動呼叫,而是由Scala自動呼叫。但如果要使用隱式轉換,則需要對隱式轉換函式進行匯入。因此通常建議將隱式轉換函式命名為"xxx2yyy"的形式

二、如何進行隱式轉換

  1. 要實現隱式轉換,只要在程式可見範圍內定義隱式轉換函式即可
  2. 隱式轉換函式於普通函式的唯一語法區別:以implicit開頭,且必須宣告函式的返回型別
    ImplicitDef

三、使用隱式轉換增強現有型別(裝飾模式)

DecorateImplicit

四、匯入隱式轉換函式的作用域

  1. Scala預設使用兩種隱式轉換
    (1)源型別或目標型別的伴生物件中宣告的隱式轉換函式
    (2) 當前程式作用域內可用唯一識別符號確定的隱式轉換函式

  2. 如果隱式轉換函式不在上述預設位置的話,就必須手動import匯入某個包下的隱式轉換函式

  3. 通常建議:僅在需要進行隱式轉換的地方(如函式體或方法體內)用import匯入隱式轉換函式以縮小隱式轉換函式作用域,避免不必要的型別轉換

五、隱式轉換的發生時機

  1. 呼叫某個函式,但傳入的實參型別於定義的形參型別不匹配
  2. 使用某個物件呼叫其類中不存在的方法
  3. 使用某個型別的物件,呼叫某個方法,雖然該類中存在該方法,但傳入的實參型別與定義的形參型別不匹配

六、隱式引數(類DI)

  1. 隱式引數,是指在函式或方法內,定義一個用implicit修飾的引數,此時Scala會嘗試找到一個指定型別的,用implicit修飾的隱式值進行注入

  2. 查詢範圍:
    (1) 當前作用域內可見的val或var定義的隱式變數
    (2) 隱式引數型別的伴生物件內的隱式值
    (3) 案例
    ImpicitArgs