基於MQB平臺打造/有望取代昕動上市 斯柯達SCALA路測實拍圖曝光
近日,我們從外媒獲取到一組全新斯柯達SCALA路測實拍圖,新車基於MQB平臺打造,據悉,目前正在海外銷售的入門級緊湊級車斯柯達SCALA似乎有望成為昕動等...
隱式轉換函數:
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)