Scala隱式轉換幾種使用場景

2021-08-17 05:51:01 字數 2641 閱讀 5049

scala提供的隱式轉換的特性的作用,簡單說就是:當scala編譯器進行型別匹配時,如果找不到合適的型別,那麼隱式轉換會讓編譯器在作用範圍內自動推導出合適的型別,在**重構設計上,可以避免冗餘的**,使得**非常優雅。

使用場景一:隱式引數

scala>  def sayhello(age: int)(implicit name: string) = println("my name is:" + name + ",my age is:" + age)

sayhello: (age: int)(implicit name: string)unit

scala> implicit val name = "cyony"

name: string = cyony

scala> sayhello(25)

my name is:cyony,my age is:25

sayhello函式有兩個引數,其中name為隱式引數,在實際呼叫中不需要顯示傳入這個引數,但是在作用域範圍內必須宣告乙個string型別的隱式變數,這樣在呼叫的時候,會自動傳入這個變數。ps:如果在同乙個作用域內定義了兩個同型別的隱式變數,則會有衝突。

隱式引數的作用域範圍有兩個:一種是當前作用域內可見的val或者var定義的隱式變數;一種是隱式引數型別的伴生物件內的隱式值。

scala> implicit val name1 = "cyony1"

name1: string = cyony1

scala> sayhello(25)

:16: error: ambiguous implicit values:

both value name of type => string

and value name2 of type => string

match expected type string

sayhello(25)

^

使用場景二:型別匹配

scala> import scala.language.implicitconversions

import scala.language.implicitconversions

scala> implicit def int2range(num : int): range = 1 to num

int2range: (num: int)range

scala> def spreadnum(range: range): string = range.mkstring(",")

spreadnum: (range: range)string

scala> spreadnum(5)

res0: string = 1,2,3,4,5

上面所示,spreadnum函式簽名是個range型別的引數,但是傳入的值是乙個int型別的,所以編譯器在作用域內找到了int2range隱式轉換函式,自動將int轉換為range物件來適配。

隱式轉換的函式叫什麼名字無所謂,因為實際呼叫中不會手動呼叫,但是如果需要使用隱式轉換函式,需要import方式手動匯入,才能被編譯器尋找到。

使用場景三:型別增強

scala> class man(val name: string)

defined class man

scala> class superman(val name: string)

defined class superman

scala> implicit def man2superman(man: man): superman = new superman(man.name)

man2superman: (man: man)superman

scala> val cyony = new man("cyony")

cyony: man = man@63d3c9dc

scala> cyony.fly

you can fly

編譯器在呼叫fly方法時,發現man物件並沒有這個函式,然後通過man2superman隱式函式轉換成superman物件,進而呼叫他的fly函式,來實現型別增強功能。

或者可以通過隱式類的方式來實現相同的功能,**如下:

scala> class man(name: string)

defined class man

scala> implicit class myimplicittypeconversion(val man: man)

defined class myimplicittypeconversion

scala> val cyony = new man("cyony")

cyony: man = man@7412a438

scala> cyony.fly

you can fly

隱式轉換的發生時機:

1、呼叫某個函式,但是給函式傳入的引數型別,與函式定義的簽名不匹配。

2、使用某個型別物件,呼叫某個方法,而這個方法並不存在於該型別時。

3、使用某個型別物件,呼叫某個方法,雖然該型別有這個方法,但是給方法傳入的引數型別與簽名並不一致的時候。

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關鍵字宣告的帶有單個引數的函式,這樣的函式將被自動應用...