scala隱式轉換函式及隱式值

2021-09-25 20:14:58 字數 2360 閱讀 1327

隱式函式基本介紹

隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式,這種函式將會自動呼叫,將值從一種類

型轉換到另一種型別,使用隱式函式可以優雅的解決資料型別轉換

隱式轉換的注意事項和細節

1 隱式轉換函式的函式名可以是任意的,隱式轉換與函式名稱無關,只與函式 簽名(函式引數型別和

返回值型別)有關

2 隱式函式可以有多個(即:隱式函式列表),但是需要保證在當前環境下,只有乙個隱式函式能被識

object implicitdemo01 

implicit def f2(f:float): int =

// 這裡我們必須保證隱式函式的匹配只能是唯一的

// implicit def f3(f1:float): int =

val num: int = 3.5 //底層編譯f1$1(3.5)

val num2: int = 4.5f

println("num=" + num)

}}

基本介紹

如果需要為乙個類增加乙個方法,可以通過隱式轉換來實現.(動態增加功能)比如想為mysql類增加乙個delete方法

分析解決方案

在當前程式中,如果想要給mysql類增加功能是非常簡單的,但是在實際專案中,如果想要增

加新的功能就會需要改變源**,這是很難受的,而且違背了軟體開發的ocp開發原則(閉合原則

open close priceple)在這種情況下,可以通過隱式轉換函式給類動態新增功能

object implicitdemo02 

// 建立mysql物件

val mysql = new mysql

mysql.insert()

mysql.delete() //分析 adddelete$1(mysql).delete()

mysql.update()

}}class mysql

}class db

def update()

}

基本介紹

隱式值也叫隱式變數,將某個形參變數標記為implicit,所以編譯器會在方法省略隱式引數的情況下去

搜尋作用域內的隱式值作為預設引數

示例:

object implicitvaldemo03 

hello //底層hello$1(str1) 使用隱式值不要帶()

}}

案例1

隱式匹配具有唯一性

示例:

object implicitval02 //呼叫hello

hello

}}

這個時候程式會報錯,顯示錯誤:

程式會顯示模糊的隱式值這樣乙個錯誤,原因是因為程式中兩個隱式變數name和name1的型別

都是string型別,編譯器去匹配時無法識別到底是哪乙個,因此會報錯。這個時候登出乙個,程式就

會正常執行,這也再次證明了隱式匹配具有唯一性。

示例:

案例2

當同時有implicit值和預設值,implicit優先順序高
示例:

object implicitval02 //呼叫hello2

hello2

}}

當乙個隱式引數匹配不到隱式值,仍然會使用預設值
示例:

案例4

當程式中隱式引數content沒給預設值時,這個時候程式會報錯,原因是當呼叫函式時,它首先會去找隱式值,發
現上面有乙個,但是是個int型別的不能匹配,於是隱式值是匹配不到的,預設值又沒給,同時還不傳

值,因此就報錯了。但當三者都存在的時候,即既有隱式值,又有預設值,還傳了值,那這個時候傳

的值優先順序最高,然後是隱式值,最後是預設值。

示例:

小結:1 當在程式中,同時有隱式值,預設值,傳值

2 編譯器的優先順序為 傳值 > 隱式值 > 預設值

3 在隱式值匹配時,不能有二義性(即不能匹配多個)

4 如果三個(隱式值,預設值,傳值) 乙個都沒有,就會報錯

scala 隱式轉換函式 隱式轉換引數

目前的scala相關部落格大概只能算乙個筆記,方便自己記錄,也幫大家查詢資訊了。首先scala中的隱式轉換可以分為隱式函式轉換與隱式引數轉換兩類,下面就來分別說一下自己對這兩種模式的理解。1 隱式函式轉換,我們先看一段 scala val x int 3.14 10 error type misma...

scala隱式轉換函式

定義 1.只要在程式可見的範圍內定義了隱式轉換函式,就會被scala自動呼叫 2.隱式轉換函式的名字可以任意,建議名為 2yyy 3.以implicit開頭,而且最好定義函式返回型別 eg object test else if obj.getclass classof older else nul...

Scala 基礎11 隱式轉換和隱式值

1 隱式函式 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別 object scala01 使用隱式函式可以優雅的解決資料型別轉換 implicit def f1 d double int double 是輸入型別,int 是轉換...