隱式轉換
精度小的型別可以自動轉換為精度大的型別,這個轉換程序無需開發人員參與,由編譯器自動完成,這個轉換操作我們稱之為隱式轉換,
- 如果程式編譯出錯,編譯器會嘗試在整個的作用域中查找能夠讓程式編譯通過的方式
- 如果找到,那么編譯器會嘗試二次編譯,讓之前編譯出現錯誤的代碼經過轉換后能夠編譯通過,
- 這個轉換程序看不見,但是存在,就稱之為隱式轉換,所謂的隱式轉換,其實就是型別的轉換
隱式函式
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._
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520604.html
標籤:其他
