scala 隱式轉換詳解

2021-10-01 02:22:32 字數 3797 閱讀 6842

隱式轉換的引出,先看一段**

//隱式轉換的引出**

val num: int =

3.5// double 無法轉成 int -> 高精度 無法自動轉為 低精度

println

(s"num: $"

)

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

用隱式轉換的概念,優化上面的**,讓編譯通過

def main

(args: array[string]

): unit =")

}

隱式轉換的注意事項和細節:第二個細節是什麼意思呢? 看一段**

正確的姿勢應該是:

def main

(args: array[string]

): unit =

, num2: $"

)}

隱式轉換的小案例一:豐富 mysql 原始碼的功能

object implicitdemo2 

implicit def mymethod

(o: mysql)

: kinosql =

}//定義乙個類, 假設 mysql 原始碼中只有乙個 insert 方法

class

mysql

}//定義乙個我自己的類, 完善方法

class

kinosql

//刪除方法

def delete()

: unit =

}

隱式轉換的小案例二

object implicitdemo3 

}class

richfile

(file: file)

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

def main

(args: array[string]

): unit =")

} hello //底層 hello$1(str1);

}

隱式值、預設值、傳值 的優先順序普通函式, 隱式引數有預設值

//普通函式, 隱式引數有預設值

def hello

(implicit context: string =

"jack"

): unit =")

}hello // hello, scala

同時有 implicit 值和 預設值, implicit 優先順序高
implicit val name: string =

"scala"

//當 同時又 implicit 值和 預設值, implicit 優先順序高

def hello2

(implicit context: string =

"jack"

): unit =")

}hello2 // hello, scala

當乙個隱式引數匹配不到隱式值, 仍會使用預設值
implicit val name: int =

10def hello3

(implicit context: string =

"jack"

): unit =")

}hello3 // hello3, jack

當沒有隱式值, 沒有預設值, 又沒有傳值, 就會報錯
def hello4

(implicit context: string)

: unit =")

}hello4 //報錯

總結:編譯器優先順序: 傳值 > 隱式值 > 預設值

隱式匹配時,不能有二義性

如果乙個都沒有, 就會報錯

在 scala 2.10 後提供了 隱式類,可以使用 implicit 宣告類, 隱式類非常強大,同樣可以擴充套件類的功能,比前面使用隱式轉換豐富類庫的功能更加方便

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

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

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

隱式類不能是 case class (case class 樣例類)

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

object implicitdemo5 

}//建立乙個 mysql 例項

val mysql =

newmysql1

mysql.

sayok()

// 本身

mysql.

addsuffix()

//通過 mysql 關聯到 db1, 調到 db1 的 addsuffix() 方法}}

class

mysql1

}

當方法中的引數的型別 與 目標型別 不一致時,或者是複製時

def main

(args: array[string]

): unit =

//普通函式: 入參 -> int

def test1

(n: int)

: unit =

//呼叫 入參為 int 的 test1 函式

//之所以不報錯, 是因為經過了 隱式函式: f1

test1

(10.2

)}

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

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

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

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

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

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

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

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

不能存在二義性

隱式操作不能巢狀使用, 如:隱式轉換函式

//1. 不能存在二義性

//2. 隱式操作不能巢狀使用, 如:隱式轉換函式

def f2

(d: double)

: int =

val num1: int =

1.1

scala 隱式轉換

defdisplay input string unit println input implicit deftypeconvertor input int string input.tostring implicit deftypeconvertor input boolean string if...

scala 隱式轉換

隱式轉換就是 當scala編譯器進行型別匹配時,如果找不到合適的候選,那麼隱式轉化提供了另外一種途徑來告訴編譯器如何將當前的型別轉換成預期型別。使用方式 將方法或變數標記為implicit 將方法的引數列表標記為implicit 將類標記為implicit 宣告乙個帶有implicit修飾過引數的方...

scala隱式轉換

目錄 隱式轉換的概念 隱式轉換的使用 隱式轉換做引數型別轉換 隱式轉換增強現有型別 隱式引數 利用隱式引數進行隱式轉換 再議context bounds 隱式轉換函式 implicit conversion function 是以implicit關鍵字宣告的帶有單個引數的函式,這樣的函式將被自動應用...