2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数
目錄
隱式轉(zhuǎn)換和隱式參數(shù)
隱式轉(zhuǎn)換
自動(dòng)導(dǎo)入隱式轉(zhuǎn)換方法
隱式轉(zhuǎn)換的時(shí)機(jī)
隱式參數(shù)
隱式轉(zhuǎn)換和隱式參數(shù)
隱式轉(zhuǎn)換和隱式參數(shù)是scala非常有特色的功能,也是Java等其他編程語言沒有的功能。我們可以很方便地利用隱式轉(zhuǎn)換來豐富現(xiàn)有類的功能。
?
隱式轉(zhuǎn)換
來看一個(gè)案例,
object?SuperIntDemo {def?main(args:?Array[String]):?Unit?=?{val?a:Int?=?1
// 使用中綴調(diào)用to方法println(a to 10)}
}
通過查看Int的源代碼,你會(huì)驚奇地發(fā)現(xiàn),Int類型根本沒有to方法。這難道是讓人懷疑人生的大bug嗎?
——這其實(shí)就是隱式轉(zhuǎn)換的強(qiáng)(gui)大(yi)之處。它在背后偷偷摸摸地幫我們了某種類型轉(zhuǎn)換。
所謂隱式轉(zhuǎn)換,是指以implicit關(guān)鍵字聲明的帶有單個(gè)參數(shù)的方法。它是自動(dòng)被調(diào)用的,自動(dòng)將某種類型轉(zhuǎn)換為另外一種類型。
隱式轉(zhuǎn)換的使用步驟:
在object中定義隱式轉(zhuǎn)換方法(使用implicit)
在需要用到隱式轉(zhuǎn)換的地方,引入隱式轉(zhuǎn)換(使用import)
自動(dòng)調(diào)用隱式轉(zhuǎn)化后的方法
示例:使用隱式轉(zhuǎn)換,讓File具備有reada
class?RichFile(val?f:File)?{// 將文件中內(nèi)容讀取成字符串def?read()?=?Source.fromFile(f).mkString
}object?MyPredef {// 定義隱式轉(zhuǎn)換方法implicit?def?file2RichFile(f:File)?=?new?RichFile(f)
}object?ImplicitConvertDemo {def?main(args:?Array[String]):?Unit?=?{val?f =?new?File("./data/textfiles/1.txt")// 導(dǎo)入隱式準(zhǔn)換import?MyPredef.file2RichFile// 調(diào)用的其實(shí)是RichFile的read方法println(f.read())}
}
?
自動(dòng)導(dǎo)入隱式轉(zhuǎn)換方法
前面,我們手動(dòng)使用了import來導(dǎo)入隱式轉(zhuǎn)換。是否可以不手動(dòng)import呢?
在scala中,如果在當(dāng)前作用域中有隱式轉(zhuǎn)換方法,會(huì)自動(dòng)導(dǎo)入隱式轉(zhuǎn)換。
示例:將隱式轉(zhuǎn)換方法定義在main所在的object中
class?RichFile(val?f:File)?{// 將文件中內(nèi)容讀取成字符串def?read()?=?Source.fromFile(f).mkString
}object?ImplicitConvertDemo {// 定義隱式轉(zhuǎn)換方法implicit?def?file2RichFile(f:File)?=?new?RichFile(f)def?main(args:?Array[String]):?Unit?=?{val?f =?new?File("./data/textfiles/1.txt")// 調(diào)用的其實(shí)是RichFile的read方法println(f.read())}
}
?
隱式轉(zhuǎn)換的時(shí)機(jī)
什么時(shí)候會(huì)自動(dòng)執(zhí)行隱式轉(zhuǎn)換呢?
當(dāng)對(duì)象調(diào)用中不存在的方法時(shí),編譯器會(huì)自動(dòng)將對(duì)象進(jìn)行隱式轉(zhuǎn)換
當(dāng)方法中的參數(shù)類型與目標(biāo)類型不一致時(shí)
示例:
object?ImplicitConvertDemo {// 定義隱式轉(zhuǎn)換方法implicit?def?file2RichFile(f:File)?=?new?RichFile(f)def?main(args:?Array[String]):?Unit?=?{val?f =?new?File("./data/textfiles/1.txt")// test1接收的參數(shù)類型為Rich,此時(shí)也自動(dòng)進(jìn)行了隱式轉(zhuǎn)換test1(f)}def?test1(r:RichFile)?=?println(r.read())
}
?
隱式參數(shù)
函數(shù)或方法可以帶有一個(gè)標(biāo)記為implicit的參數(shù)列表。這種情況,編譯器會(huì)查找缺省值,提供給該方法。
定義隱式參數(shù):
在方法后面添加一個(gè)參數(shù)列表,參數(shù)使用implicit修飾
在object中定義implicit修飾的隱式值
調(diào)用方法,可以不傳入implicit修飾的參數(shù)列表,編譯器會(huì)自動(dòng)查找缺省值
示例:
// 定義一個(gè)分隔符類
case?class?Delimiters(left:String,?right:String)object?MyPredef1 {implicit?val?quoteDelimiters =?Delimiters("<<<",?">>>")
}object?ImplicitParamDemo {// 使用分隔符將想要引用的字符串括起來def?quote(what:String)(implicit?delims:Delimiters)?=?delims.left +?what +?delims.rightdef?main(args:?Array[String]):?Unit?=?{println(quote("hello, world")(Delimiters("<<",?">>")))// 手動(dòng)導(dǎo)入import?MyPredef1._println(quote("hello, world"))}
}
和隱式轉(zhuǎn)換一樣,可以使用import手動(dòng)導(dǎo)入隱式參數(shù)
如果在當(dāng)前作用域定義了隱式值,會(huì)自動(dòng)進(jìn)行導(dǎo)入
總結(jié)
以上是生活随笔為你收集整理的2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年大数据常用语言Scala(三十
- 下一篇: 2021年大数据Flink(四十六):扩