隱式函式基本介紹
隱式轉換函式是以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 是轉換...