Scala的隱式引數和隱式轉換

2021-09-19 16:23:16 字數 1170 閱讀 1351

隱式(implicit)是scala中最重要的內容同時也是最難懂的概念。

在scala中隱式的概念主要包括三個方面的內容:

1隱式引數

2隱式轉換

3隱式呼叫

首先隱式implicit 是什麼意思? 在scala中implicit是在編譯器需要修復型別匹配時,可以用來自動插入的定義。比如舉個例子,我要把2.33賦值給乙個int型別的a肯定會報錯,但是通過隱式轉換就可以不報錯了。還有例如 x是整數型別,y是浮點型別

x+y 編譯器可能會嘗試使用乙個轉換函式convert函式這個concert就是使用implicit定義的,結果就是convert(x)+y

使用implicat的規則:

1 標記規則

只有使用implicit關鍵字修飾的定義才是可以使用隱式定義。關鍵字implicit用來標記乙個隱式定義。編譯器可以選擇它作為隱式變化的候選項。你可以使用implicit標記任意變數,函式或物件。

2 範圍規則

編譯器在選擇備選implicit定義時,只會選擇當前作用域的定義。例如編譯器不會調取 otherpackge.convert。如果需要使用其他包的方法的話需要把該方法引入到當前域中。也就是說,編譯器在選擇備選implicit時,只有當convert是當前作用域下的單個標誌符時,它才會作為備選的implicit。引用其他包方法可以通過「import  otherpackge._」

3 一次規則

編譯器在需要使用implicit定義時,只會試圖嘗試轉換一次,編譯器不會把x+y轉換成 convert1(convert2(x)+y)

4 優先規則

編譯器不會再x+y已經合法的情況下再去呼叫implicit

5 命名規則

可以為implicit定義任務的名稱。implicit通常只在兩種情況下有作用:第一是你想在乙個方法中明確指明;另外乙個是把乙個引入到當前作用域

什麼情況下編譯器會使用implicit:

1 轉換成預期的資料型別 ,比如乙個方法的引數型別是string型別的,但在引數傳入的時候是乙個int型別的,編譯器會發現型別不匹配,就會從當前作用域中檢查是否有從int轉string型別的隱式轉換

2 * 轉換 selection的receiver* //

3 隱含引數 隱含引數類似於預設引數。如果呼叫方法時沒有提供某個引數,編譯器會查詢當前作用域中是否有合法的符合條件的implicit物件作為引數傳入

Scala 隱式轉換和隱式引數

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

Scala隱式轉換與隱式引數

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

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

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