隱式轉換 精度小的類型可以自動轉換為精度大的類型,這個轉換過程無需開發人員參與,由編譯器自動完成,這個轉換操作我們稱之為隱式轉換。 如果程式編譯出錯,編譯器會嘗試在整個的作用域中查找能夠讓程式編譯通過的方式 如果找到,那麼編譯器會嘗試二次編譯,讓之前編譯出現錯誤的代碼經過轉換後能夠編譯通過。 這個轉 ...
隱式轉換
精度小的類型可以自動轉換為精度大的類型,這個轉換過程無需開發人員參與,由編譯器自動完成,這個轉換操作我們稱之為隱式轉換。
- 如果程式編譯出錯,編譯器會嘗試在整個的作用域中查找能夠讓程式編譯通過的方式
- 如果找到,那麼編譯器會嘗試二次編譯,讓之前編譯出現錯誤的代碼經過轉換後能夠編譯通過。
- 這個轉換過程看不見,但是存在,就稱之為隱式轉換,所謂的隱式轉換,其實就是類型的轉換
隱式函數
object ScalaImplicit {
def main(args: Array[String]): Unit = {
implicit def transform( d : Double ): Int = {
d.toInt
}
var d : Double = 2.0
val i : Int = d
println(i)
}
}
隱式函數實現程式功能的擴展
符合OCP
def main(args: Array[String]): Unit = {
// 使用implicit聲明的函數為隱式函數。
implicit def thransform( user:User ): UserExt = {
new UserExt()
}
val user = getUser()
user.insertUser()
user.updateUser()
}
class UserExt {
def updateUser(): Unit = {
println("update user...")
}
}
class User {
def insertUser(): Unit = {
println("insert user...")
}
}
def getUser() = {
new User()
}
隱式參數
def reg( implicit password : String = "000000" ): Unit = {
println("預設密碼:" + password)
}
隱式變數
- 隱式參數不用傳遞,這個傳遞的過程由編譯器完成
- 在同一個作用域中,如果相同的轉換規則的多個數據,會發生錯誤
implicit val password : String = "111111"
reg ==> 預設密碼:111111
隱式類
在Scala2.10後提供了隱式類,可以使用implicit聲明類,隱式類非常強大,同樣可以擴展類的功能,在集合的數據處理中,隱式類發揮了重要的作用。
- 其所帶的構造參數有且只能有一個
- 隱式類必須被定義在“類”或“伴生對象”或“包對象”里,即隱式類不能是頂級的。
def main(args: Array[String]): Unit = {
val user = new User()
user.insertUser()
user.updateUser()
}
implicit class UserExt(user:User) {
def updateUser(): Unit = {
println("update user...")
}
}
class User {
def insertUser(): Unit = {
println("insert user...")
}
隱式機制
-
當前代碼作用域
implicit class UserExt(user:User) { def updateUser(): Unit = { println("update user...") } }
-
父類或伴生對象
class Parent { implicit class UserExt(user:User) { def updateUser(): Unit = { println("update user...") } } } object Parent { implicit class UserExt(user:User) { def updateUser(): Unit = { println("update user...") } } }
-
特征或伴生對象
trait MyTrait { implicit class UserExt(user:User) { def updateUser(): Unit = { println("update user...") } } } object MyTrait { implicit class UserExt(user:User) { def updateUser(): Unit = { println("update user...") } }
-
在其他地方聲明(包對象)
package object chapter { implicit class UserExt(user:User) { def updateUser(): Unit = { println("update user...") } } }
-
直接導入
import com.atguigu.bigdata.scala.test.TestTransform._