隱式轉換和隱式引數

2022-03-18 09:34:49 字數 2629 閱讀 2355

1)隱式轉換

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

object scala01

}

implicit def f1(d: double): int =

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

隱式函式的底層工作原理

def main(args: array[string]): unit =

implicit def f2(l: long): int =

val num: int = 3.5

println(num)

val num2: int = 4.5

println(num2)

val num3: int = 20l

}

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

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

//在當前環境中,不能存在滿足條件的多個隱式函式

implicit def a(d: double) = d.toint

implicit def b(d: double) = d.toint

val i1: int = 3.5 //(x)在轉換時,識別出有兩個方法可以被使用,就不確定呼叫哪乙個,所以出錯

println(i1)

案例:使用隱式轉換方式動態的給mysql類增加delete方法。

class mysql

}class db

}implicit def adddelete(mysql:mysql): db =

val mysql = new mysql

mysql.insert()

mysql.delete()

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

implicit val str1: string = "jack"

def hello(implicit name: string): unit =

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

object implicitval

}hello

}def hello(): unit =

}   

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

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

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

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

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

class mysql1

}def main(args: array[string]): unit =

}val mysql1 = new mysql1

mysql1.sayok()

println(mysql1.addsuffix())

}

4)隱式的轉換時機(1)當方法中的引數的型別與目標型別不一致時

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

5)隱式解析機制

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

(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都會被搜尋。

6)隱式轉換的前提

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

(1)不能存在二義性

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

八 隱式轉換和隱式引數

目錄 一 隱式轉換 1 隱式函式入門 2 隱式轉換的注意事項和細節 3 隱式轉換豐富類庫功能 二 隱式值 三 隱式類 四 隱式的轉換時機 五 隱式解析機制 六 隱式轉換的前提 1 隱式函式基本介紹 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉...

Scala 隱式轉換和隱式引數

紙上得來終覺淺,絕知此事要躬行!隱式函式基本介紹 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別 隱式函式快速入門 使用隱式函式可以優雅的解決資料型別轉換,案例入門.implicit def f1 d double int dou...

Scala的隱式引數和隱式轉換

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