目錄
一、隱式轉換
1、隱式函式入門
2、隱式轉換的注意事項和細節
3、隱式轉換豐富類庫功能
二、隱式值
三、隱式類
四、隱式的轉換時機
五、隱式解析機制
六、隱式轉換的前提
(1)隱式函式基本介紹
隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別
(2)隱式函式快速入門
使用隱式函式可以優雅的解決資料型別轉換
object implicitabout
}// 隱式函式應當在作用於才能生效,使用隱式轉換時需要匯入
import implicitabout._
object implicittest
}
//在當前環境中,不能存在滿足條件的多個隱式函式
implicit def a(d: double) = d.toint
implicit def b(d: double) = d.toint
val i1: int = 3.5 //(x)在轉換時,識別出有兩個方法可以被使用,就不確定呼叫哪乙個,所以出錯
println(i1)
(1)基本介紹
如果需要為乙個類增加乙個方法,可以通過隱式轉換來實現。(動態增加功能)比如想為mysql類增加乙個delete方法
(2)解決方案
在當前程式中,如果想要給mysql類增加功能是非常簡單的,但是在實際專案中,如果想要增加新的功能就會需要改變源**,這是很難接受的。而且違背了軟體開發的ocp開發原則 (閉合原則 open close priceple),在這種情況下,可以通過隱式轉換函式給類動態新增功能。
object implicittest
def main(args: array[string]): unit =
}class mysql
}class db
def update(): unit =
}
1、基本介紹
隱式值也叫隱式變數,將某個形參變數標記為implicit,所以編譯器會在方法省略隱式引數的情況下去搜尋作用域內的隱式值作為預設引數
object implicittest
def hello(implicit name: string): unit =
def testmultiparam(id:int,age:int)(implicit name: string): unit =
}
1、基本介紹
在scala2.10後提供了隱式類,可以使用implicit宣告類,隱式類的非常強大,同樣可以擴充套件類的功能,比前面使用隱式轉換豐富類庫功能更加的方便,在集合中隱式類會發揮重要的作用。
(1)隱式類使用有如下幾個特點:
(2)例項
object implicittest
}val mysql = new mysql
mysql.sayok()
==> db1$1(mysql1).addsuffix()
//db1$1(mysql1)返回的型別是 implicitclass$db1$2
// println(mysql.addsuffix())
val resstr = mysql.addsuffix()
println(resstr)
}}class mysql
}
object implicittest
def test(n:int):unit=
// 隱式轉換
implicit def f1(d: double): int =
}
即編譯器是如何查詢到缺失資訊的,解析具有以下兩種規則:
1、首先會在當前**作用域下查詢隱式實體(隱式方法、隱式類、隱式物件)。(一般是這種情況)
2、如果第一條規則查詢隱式實體失敗,會繼續在隱式引數的型別的作用域裡查詢。型別的作用域是指與該型別相關聯的全部伴生模組,乙個隱式實體的型別t它的查詢範圍如下(這種情況範圍廣且複雜在使用時,應當盡量避免出現):
在進行隱式轉換時,需要遵守兩個基本的前提:
object implicittest
implicit def f1(d:double):int=
}
隱式轉換和隱式引數
1 隱式轉換 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別 object scala01 implicit def f1 d double int double 是輸入型別,int 是轉換後的型別 隱式函式的底層工作原理 def...
Scala 隱式轉換和隱式引數
紙上得來終覺淺,絕知此事要躬行!隱式函式基本介紹 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別 隱式函式快速入門 使用隱式函式可以優雅的解決資料型別轉換,案例入門.implicit def f1 d double int dou...
Scala的隱式引數和隱式轉換
隱式 implicit 是scala中最重要的內容同時也是最難懂的概念。在scala中隱式的概念主要包括三個方面的內容 1隱式引數 2隱式轉換 3隱式呼叫 首先隱式implicit 是什麼意思?在scala中implicit是在編譯器需要修復型別匹配時,可以用來自動插入的定義。比如舉個例子,我要把2...