scala學習筆記 隱式轉換

2021-10-08 17:07:13 字數 1511 閱讀 4271

使用implicit關鍵字宣告的帶有單個引數的函式,會自動運用,將值從一種型別轉換為另一種型別

implicit

def fun(num:

double):

int=num.toint+

1var num:

int=

3.5//輸出4.5

注意:

隱式轉化與函式名無關,只與引數型別和返回值型別有關

隱式函式可以有多個,但必須保證當前域只有乙個被識別

將某個形參變數標記為implicit,當編譯器在方法省略隱式引數時,搜尋域中的隱式值作為預設引數

implicit

val str1:

string

="jack~"

def hello(implicit name:

string):

unit

=//hello("hello") 輸出 hellohello

//hello() 輸出jack~hello

注意:

當程式中同時又隱式值,預設值,傳值時,優先順序:傳值》隱式值》預設值

隱式值匹配時,不能有二義性(即無歧義)

若三個全都沒有,程式報錯

使用implicit宣告類,作用是擴充套件類的功能

class dog

object test

}object person

}

注意:

隱式類所帶的構造引數有且只有1個

隱式類不能是頂級的

隱式類不能是樣例類

作用域類不能有與之相同的識別符號

注意import包中帶有的隱式類

編譯器如何查詢隱式資訊

首先會在當前**作用域下查詢隱式實體(隱式方法、隱式類、隱式物件)。(一般是這種情況

如果第一條規則查詢隱式實體失敗,會繼續在隱式引數的型別的作用域裡查詢。型別的作用域

是指與該型別相關聯的全部伴生模組,乙個隱式實體的型別t 它的查詢範圍如下(第二種情況範圍廣且 複雜在使用時,應當盡量避免出現):

a) 如果 t 被定義為 t with awith 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學習筆記 隱式轉換和隱式引數

隱式轉換 隱式引數 示例 示例1 隱式轉換 object mypredef class richfile val file file object richfile 示例2 隱式轉換 class cclass a c c class b c c def writebook unit object a...

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修飾過引數的方...