其實隱式轉(zhuǎn)換有幾種類型:隱式參數(shù),隱式轉(zhuǎn)換嗤栓,隱式對象,和隱式類
首先看一下Scala的作用域
隱式參數(shù)沖突的情況:
object Implicits {
implicit val content="Scala"
}
object ImplicitsMsg {
implicit val content="ScalaMsg"
}
object ImplicitAdance extends App {
def printContent(implicit content:String)=println(content)
// implicit val msg="Spark" //有兩個隱式參數(shù)的時候箍邮,就會出現(xiàn)沖突
import Implicits.content //當(dāng)你導(dǎo)入一個類的時候茉帅,連伴生對象的成員也會導(dǎo)入進(jìn)來,
//當(dāng)明確指定需要導(dǎo)入哪個屬性的時候,優(yōu)先級會更高(當(dāng)然不是隱式參數(shù)的情況)
import ImplicitsMsg._
printContent
}
非隱式參數(shù)不沖突锭弊,明確指定的導(dǎo)入方式優(yōu)先級更高
object Implicits {
val content="Scala"
}
object ImplicitsMsg {
val content="ScalaMsg"
}
object ImplicitAdance extends App {
def printContent(implicit content:String)=println(content)
// implicit val msg="Spark" //有兩個隱式參數(shù)的時候堪澎,就會出現(xiàn)沖突
import Implicits.content //當(dāng)你導(dǎo)入一個類的時候,連伴生對象的成員也會導(dǎo)入進(jìn)來,
//當(dāng)明確指定需要導(dǎo)入哪個屬性的時候味滞,優(yōu)先級會更高(當(dāng)然不是隱式參數(shù)的情況)
import ImplicitsMsg._
printContent(content)
}
當(dāng)然樱蛤,當(dāng)前作用域的優(yōu)先級還是最高的:
object Implicits {
val content="Scala"
}
object ImplicitsMsg {
val content="ScalaMsg"
}
object ImplicitAdance extends App {
def printContent(implicit content:String)=println(content)
val content="Spark" //有兩個隱式參數(shù)的時候,就會出現(xiàn)沖突
import Implicits.content //當(dāng)你導(dǎo)入一個類的時候剑鞍,連伴生對象的成員也會導(dǎo)入進(jìn)來,
//當(dāng)明確指定需要導(dǎo)入哪個屬性的時候昨凡,優(yōu)先級會更高(當(dāng)然不是隱式參數(shù)的情況)
import ImplicitsMsg._
printContent(content)
}
另外一個例子說明:
object Implicits {
implicit val content="Scala"
}
//object ImplicitsMsg {
// val content="ScalaMsg"
//}
object ImplicitAdance extends App {
def printContent(implicit content:String)=println(content)
val content="Spark" //有兩個隱式參數(shù)的時候,就會出現(xiàn)沖突
import Implicits.content //當(dāng)你導(dǎo)入一個類的時候蚁署,連伴生對象的成員也會導(dǎo)入進(jìn)來,
//當(dāng)明確指定需要導(dǎo)入哪個屬性的時候土匀,優(yōu)先級會更高(當(dāng)然不是隱式參數(shù)的情況)
// import ImplicitsMsg._
printContent(content)
}
隱式轉(zhuǎn)換能起到增強(qiáng)功能的作用
class RichFile(val file:File) {
def dtSpark=println("dySpark:"+file.getName)
}
object Implicits {
implicit val content="Scala"
implicit def int2String(x:Int)=x.toString()
implicit def fileToRichFile(file:File)=new RichFile(file)
implicit def richFileToFile(richFile:RichFile)=richFile.file //一般還會重新轉(zhuǎn)換回來
}
object ImplicitAdance extends App {
def printContent(implicit content:String)=println(content)
val content="Spark" //有兩個隱式參數(shù)的時候,就會出現(xiàn)沖突
import Implicits._ //當(dāng)你導(dǎo)入一個類的時候形用,連伴生對象的成員也會導(dǎo)入進(jìn)來,
//當(dāng)明確指定需要導(dǎo)入哪個屬性的時候就轧,優(yōu)先級會更高(當(dāng)然不是隱式參數(shù)的情況)
// import ImplicitsMsg._
printContent(content)
printContent(100)
(new File(".")).dtSpark
}
這是很有用的,例如我們只想在某一時刻用到一個類的功能田度,但不是一直都在使用妒御,這時候使用隱式轉(zhuǎn)換是非常有用的
一般來說,隱式轉(zhuǎn)換都會放到伴生對象中镇饺,這樣有利于組織代碼乎莉,例如Spark的RDD就是一個很好的例子
在設(shè)計隱式轉(zhuǎn)換的時候必須注意沖突的問題
找出當(dāng)前作用域中隱式參數(shù)的值
println(implicitly[String])
總結(jié)隱式轉(zhuǎn)換的順序:1.上下文 2.伴生對象 3.相關(guān)類型的伴生對象 4.導(dǎo)入
歸納總結(jié):1.隱式轉(zhuǎn)換的幾種類型
2.隱式轉(zhuǎn)換查找的順序
3.幾個例子
4.隱式轉(zhuǎn)換的巨大作用和最佳實踐
5.implicitly[String]的作用
cccc.png