柚子快報邀請碼778899分享:后端 Scala隱式轉(zhuǎn)換
柚子快報邀請碼778899分享:后端 Scala隱式轉(zhuǎn)換
????????Scala 的隱式轉(zhuǎn)換是一種自動類型轉(zhuǎn)換機制,它可以在編譯器自動插入一些代碼,將一個類型自動轉(zhuǎn)換成另一個類型。這種轉(zhuǎn)換可以發(fā)生在函數(shù)調(diào)用、賦值、類型轉(zhuǎn)換等多種場景中。
????????隱式轉(zhuǎn)換的機制可以讓 Scala 代碼更加簡潔、優(yōu)雅。例如,我們可以通過隱式轉(zhuǎn)換實現(xiàn)一些類型之間的轉(zhuǎn)換,而不需要手動編寫轉(zhuǎn)換代碼。
1 隱式函數(shù)
下面是一個簡單的例子,展示了如何使用隱式轉(zhuǎn)換將一個字符串轉(zhuǎn)換成整數(shù):
object TestImplicit {
def main(args: Array[String]): Unit = {
val i: Int = "123"
println(i)
}
implicit def StringtoInt(s: String): Int = {
Integer.parseInt(s)
}
}
將函數(shù)注釋掉之后,IDEA也會進行報錯,
2 隱式參數(shù)
????????普通方法或者函數(shù)中的參數(shù)可以通過 implicit 關(guān)鍵字聲明為隱式參數(shù),調(diào)用該方法時, 就可以傳入該參數(shù),編譯器會在相應(yīng)的作用域?qū)ふ曳蠗l件的隱式值。
同一個作用域中,相同類型的隱式值只能有一個編譯器按照隱式參數(shù)的類型去尋找對應(yīng)類型的隱式值,與隱式值的名稱無關(guān)。隱式參數(shù)優(yōu)先于默認(rèn)參數(shù)
implicit val str: String = "辰辰"
def hello()(implicit arg: String = "cc") = println(arg)
def main(args: Array[String]): Unit = {
hello // 辰辰
}
3 隱式類
????????在 Scala2.10 后提供了隱式類,可以使用 implicit 聲明類,隱式類的非常強大,同樣可以擴展類的功能,在集合中隱式類會發(fā)揮重要的作用。
其所帶的構(gòu)造參數(shù)有且只能有一個隱式類必須被定義在“類”或“伴生對象”或“包對象”里,即隱式類不能是頂級的。
object TestImplicit {
implicit class StringExtensions(s: String) {
def increment: String = s.map(x => (x + 1).toChar)
}
def main(args: Array[String]): Unit = {
val str = "chen chen"
println(str.increment) // difo!difo
}
}
? ? ? ? 此隱式類擴展了?String?類型的功能,添加了一個名為?increment?的方法,該方法將字符串中的每個字符的 ASCII 值加 1,并返回新的字符串
4 隱式機制解析
編譯器查找順序
首先會在當(dāng)前代碼作用域下查找隱式實體(隱式方法、隱式類、隱式對象)。( 一般是這種情況)如果第一條規(guī)則查找隱式實體失敗,會繼續(xù)在隱式參數(shù)的類型的作用域里查找。類型的作用域是指與該類型相關(guān)聯(lián)的全部伴生對象以及該類型所在包的包對象。
?需要注意的是,隱式轉(zhuǎn)換可能會導(dǎo)致一些意想不到的行為,因此在使用隱式轉(zhuǎn)換時,我們需要謹(jǐn)慎地考慮其可能帶來的影響。
柚子快報邀請碼778899分享:后端 Scala隱式轉(zhuǎn)換
好文閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。