Scala 隱式轉換和隱式引數

2021-10-22 06:23:06 字數 1973 閱讀 1631

紙上得來終覺淺,絕知此事要躬行!

隱式函式基本介紹:隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別

隱式函式快速入門

使用隱式函式可以優雅的解決資料型別轉換,案例入門.

implicit def f1(d: double): int =

//double 是輸入型別, int 是轉換後的型別

// 底層 會生成f1$1,編譯器會編譯為f1$1(3.5)

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

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

2)隱式函式可以有多個(即:隱式函式列表),但是需要保證在當前環境下,只有乙個隱式函式能被識別,編譯器在轉換時,識別出有兩個方法可以被使用,就不確定呼叫哪乙個,所以會出錯

隱式轉換功能豐富類庫

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

分析解決方案:在當前程式中,如果想要給mysql類增加功能是非常簡單的,但是在實際專案中,如果想要增加新的功能就會需要改變源**,這是很難接受的。而且違背了軟體開發的ocp開發原則 (開閉原則 open close priceple)在這種情況下,可以通過隱式轉換函式給類動態新增功能。

隱式值基本介紹:隱式值也叫隱式變數,將某個形參變數標記為implicit,所以編譯器會在方法省略隱式引數的情況下去搜尋作用域內的隱式值作為預設引數

應用案例implicit val str1: string = 「jack」

def hello(implicit name: string): unit = {

println(name + " hello")

hello // 和預設引數很像, 但是功能不同,

說明:1.當乙個隱式引數匹配不到隱式值,就會使用預設值

2.當有傳值、 有implicit 隱式值和預設值的時候,優先順序傳值最高,其次implicit,最後是預設值

隱式類基本介紹:在scala2.10後提供了隱式類,可以使用implicit宣告類,隱式類的非常強大,同樣可以擴充套件類的功能,比前面使用隱式轉換豐富類庫功能更加的方便,在集合中隱式類會發揮重要的作用。

隱式類使用有如下幾個特點:

1)其所帶的構造引數有且只能有乙個

2)隱式類必須被定義在「類」或「伴生物件」或「包物件」裡,即隱式類不能是 頂級的(top-level objects)。

3)隱式類不能是case class(case class在後續介紹 樣例類)

4)作用域內不能有與之相同名稱的識別符號

隱式的轉換時機

基本介紹:1)當方法中的引數的型別與目標型別不一致時

2)當物件呼叫所在類中不存在的方法或成員時,編譯器會自動將物件進行隱式轉換(根據型別)

隱式解析機制

即編譯器是如何查詢到缺失資訊的,解析具有以下兩種規則:

1)首先會在當前**作用域下查詢隱式實體(隱式方法、隱式類、隱式物件)。

2)如果第一條規則查詢隱式實體失敗,會繼續在隱式引數的型別的作用域裡查詢。型別的作用域是指與該型別相關聯的全部伴生模組,乙個隱式實體的型別t它的查詢範圍如下(第二種情況範圍廣且複雜在使用時,應當盡量避免出現):

a) 如果t被定義為t with a with b with c,那麼a,b,c都是t的部分,在t的隱式解析過程中,它們的伴生物件都會被搜尋。

b) 如果t是引數化型別,那麼型別引數和與型別引數相關聯的部分都算作t的部分,比如list[string]的隱式搜尋會搜尋list的伴生物件和string的伴生物件。

c) 如果t是乙個單例型別p.t,即t是屬於某個p物件內,那麼這個p物件也會被搜尋。

d) 如果t是個型別注入s#t,那麼s和t都會被搜尋。

隱式轉換的前提

在進行隱式轉換時,需要遵守兩個基本的前提:

1)不能存在二義性

2)隱式操作不能巢狀使用

學習使人進步!共勉,加油!

Scala的隱式引數和隱式轉換

隱式 implicit 是scala中最重要的內容同時也是最難懂的概念。在scala中隱式的概念主要包括三個方面的內容 1隱式引數 2隱式轉換 3隱式呼叫 首先隱式implicit 是什麼意思?在scala中implicit是在編譯器需要修復型別匹配時,可以用來自動插入的定義。比如舉個例子,我要把2...

Scala隱式轉換與隱式引數

所謂隱式轉換,是指以implicit關鍵字宣告的帶有單個引數的方法。它是自動被呼叫的,自動將某種型別轉換為另外一種型別。隱式轉換的使用步驟 在object中定義隱式轉換方法 使用implicit 在需要用到隱式轉換的地方,引入隱式轉換 使用import 自動呼叫隱式轉化後的方法 示例 使用隱式轉換,...

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

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