Scala隱式轉換

Scala 編譯器 浩渺煙波 2019-06-08

隱式轉換函數:

object ListDemo{
implicit def int2String(value:Int) = value.toString
def main(args: Array[String]): Unit = {
println( 10.length)
}
}

上面的代碼能夠正常的執行,並且會輸出2. 原因是以為多了一個用implicit修飾的函數,叫做隱式函數。他與正常函數的區別是前面加了一個implicit,他的意義在與如果編譯器在編譯的時候找不到你所用的類型,那麼隱式轉換函數會自動將數據轉換成你所期望的類型。所以上面的10調用length不合法,但是會自動在當前作用域中尋找隱式函數使其合法。

隱式轉換函數的發生在下面的情形:

e是一個S類型的表達式,而需要的卻是T類型,編譯器會尋找S=>T的隱式轉換

e是一個S類型的表達式,使用點號訪問e.m時,m不是類型S的成員,編譯器會尋找合適的隱式轉換使e.m合法

再比如:

class ListDemo(value:Int) {
def sayInt(value1:Int): Unit ={
println(value + value1)
}
}
object ListDemo{
implicit def int2Val(value:Int) = new ListDemo(value)
def main(args: Array[String]): Unit = {
2.sayInt(3)
}
}

編譯器會根據隱式轉換函數把2轉換成ListDemo對象,然後調用sayInt方法進行相加

隱式轉換函數目的是由一種參數轉為另一種參數,所以隱式轉換函數的只能有一個參數

隱式類: 類的前面加implicit,隱式類用來增加類的功能

上面第二個例子中我們可以直接用隱式類來進行轉換,看起來更簡單,比如:

object ListDemo{
implicit class Demo(value:Int){
def sayInt(value1:Int): Unit ={
println(value + value1)
}
}
def main(args: Array[String]): Unit = {
2.sayInt(3)
}
}

隱式類的定義也是有限制的,比如說構造函數中必須攜帶一個參數,只能在別的trait/類/對象內部定義等。

隱式參數:

方法可以具有 隱式 參數列表,由參數列表開頭的 implicit 關鍵字標記。 如果參數列表中的參數沒有像往常一樣傳遞, Scala 將查看它是否可以獲得正確類型的隱式值,如果可以,則自動傳遞。

比如說:

class ListDemo {
def sayInt(implicit value1:Int): Unit ={
println(value1)
}
}
object ListDemo{
implicit var value:Int = 10
def main(args: Array[String]): Unit = {
new ListDemo().sayInt
}
}

上面的sayInt沒有傳遞任何值也不會報錯,是因為它自動找到了value:Int = 10,並將其專遞 了過去。

隱式轉換雖然靈活,但是無疑加大了代碼的可讀性。

只是學了學 還需多多聯繫

歡迎關注我的公眾號:北風中獨行的蝸牛(manong_xiaodong)

Scala隱式轉換

相關推薦

推薦中...