版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
19.隱式轉(zhuǎn)換與隱式參數(shù)一、隱式定義的含義及規(guī)則二、隱式地轉(zhuǎn)換到期望類(lèi)型三、隱式地轉(zhuǎn)換接收端四、隱式類(lèi)五、含有隱式參數(shù)的主構(gòu)造方法六、上下文界定七、多個(gè)匹配的隱式定義2目
錄一、隱式定義的含義及規(guī)則
3一、隱式定義的含義及規(guī)則1.1隱式定義的含義程序員事先寫(xiě)好的定義,允許編譯器隱式地插入這些定義來(lái)解決類(lèi)型錯(cuò)誤。這部分定義通常對(duì)使用者不可見(jiàn),并且由編譯器自動(dòng)調(diào)用,故而得名“隱式定義”。隱式轉(zhuǎn)換屬于隱式定義的一種。4一、隱式定義的含義及規(guī)則標(biāo)記規(guī)則。只有用關(guān)鍵字“implicit”標(biāo)記的定義才能被編譯器隱式使用,任何函數(shù)、變量或單例對(duì)象都可以被標(biāo)記。作用域規(guī)則。Scala編譯器只會(huì)考慮在當(dāng)前作用域內(nèi)的隱式定義,否則,所有隱式定義都是全局可見(jiàn)的將會(huì)使得程序異常復(fù)雜甚至出錯(cuò)。
1.2隱式定義的規(guī)則5每次一個(gè)規(guī)則。編譯器只會(huì)插入一個(gè)隱式定義,不會(huì)出現(xiàn)“convert1(convert2(x))+y”這種嵌套的形式,但是可以讓隱式定義包含隱式參數(shù)來(lái)繞開(kāi)這個(gè)限制。顯式優(yōu)先原則。如果顯式定義能通過(guò)類(lèi)型檢查,就不必進(jìn)行隱式轉(zhuǎn)換。因此,總是可以把隱式定義變成顯式的,這樣代碼變長(zhǎng)但是歧義變少。用顯式還是隱式,需要取舍。
一、隱式定義的含義及規(guī)則1.2隱式定義的規(guī)則6二、隱式地轉(zhuǎn)換到期望類(lèi)型
7二、隱式地轉(zhuǎn)換到期望類(lèi)型把一個(gè)浮點(diǎn)數(shù)賦值給整數(shù)變量會(huì)報(bào)錯(cuò)。2.1不使用隱式轉(zhuǎn)換scala>vali:Int=1.5
<console>:11:error:typemismatch;
found:Double(1.5)
required:Int
vali:Int=1.5scala的編譯器對(duì)于類(lèi)型檢查比較嚴(yán)格。8二、隱式地轉(zhuǎn)換到期望類(lèi)型使用隱式轉(zhuǎn)換可以正確地將數(shù)據(jù)轉(zhuǎn)換到期望的類(lèi)型。2.2使用隱式轉(zhuǎn)換scala>importscala.language.implicitConversions
importscala.language.implicitConversions
scala>implicitdefdoubleToInt(x:Double)=x.toInt
doubleToInt:(x:Double)Int
scala>vali:Int=1.5
i:Int=1定義一個(gè)double轉(zhuǎn)Int的隱式轉(zhuǎn)換函數(shù)。9三、隱式地轉(zhuǎn)換接收端
10三、隱式地轉(zhuǎn)換接收端scala>classMyInt(vali:Int)
definedclassMyInt
scala>1.i
<console>:14:error:valueiisnotamemberofInt
1.i
^scala>implicitdefintToMy(x:Int)=newMyInt(x)
intToMy:(x:Int)MyInt
scala>1.i
res1:Int=1因?yàn)闃?biāo)準(zhǔn)值類(lèi)Int沒(méi)有叫“i”的字段而報(bào)錯(cuò)定義一個(gè)隱式轉(zhuǎn)換函數(shù),會(huì)將Int對(duì)象轉(zhuǎn)換成MyInt對(duì)象,使i的訪問(wèn)合法?!?.i”被編譯器隱式地展開(kāi)成了“intToMy(1).i”11四、隱式類(lèi)
12四、隱式類(lèi)4.1基本介紹使用關(guān)鍵字“implicit”聲明。編譯器會(huì)在隱式類(lèi)的相同層次下自動(dòng)生成一個(gè)與類(lèi)名相同的隱式轉(zhuǎn)換函數(shù),該轉(zhuǎn)換接收一個(gè)與隱式類(lèi)的主構(gòu)造方法相同的參數(shù),并用這個(gè)參數(shù)構(gòu)造一個(gè)隱式類(lèi)的實(shí)例對(duì)象來(lái)返回。4.2注意事項(xiàng)隱式類(lèi)不能是caseclass,并且主構(gòu)造方法有且僅有一個(gè)參數(shù)。隱式類(lèi)只能被定義在“類(lèi)”、“單例對(duì)象”或“特質(zhì)”里,不能單獨(dú)出現(xiàn)在頂層。13四、隱式類(lèi)4.3定義一個(gè)構(gòu)造長(zhǎng)方形的隱式類(lèi)自動(dòng)生成的caseclassRectangle(width:Int,height:Int)
objectRec{
implicitclassRectangleMaker(width:Int){
defx(height:Int)=Rectangle(width,height)
}
//implicitdefRectangleMaker(width:Int)=newRectangleMaker(width)
}14四、隱式類(lèi)4.4使用隱式類(lèi)scala>importRec.RectangleMaker
importRec.RectangleMaker
scala>1x10
res0:Rectangle=Rectangle(1,10)scala>1x10
<console>:12:error:valuexisnotamemberofInt
1x10
^Int類(lèi)并不存在方法“x”隱式轉(zhuǎn)換函數(shù)RectangleMaker可以把Int對(duì)象轉(zhuǎn)換成一個(gè)RectangleMaker類(lèi)的對(duì)象15五、隱式參數(shù)
16五、隱式參數(shù)在函數(shù)的最后一個(gè)參數(shù)列表中使用關(guān)鍵字“implicit”將該參數(shù)列表中的參數(shù)都聲明為隱式的,這樣整個(gè)參數(shù)列表的參數(shù)都是隱式參數(shù)。如:5.1聲明方式注意,即使括號(hào)里有多個(gè)參數(shù),也只需要開(kāi)頭寫(xiě)一個(gè)“implicit”。而且每個(gè)參數(shù)都是隱式的,不存在部分隱式部分顯式。defgreet(name:String)(implicitprompt:PreferredPrompt, drink:PreferredDrink)隱式參數(shù)包括隱式變量、隱式對(duì)象、隱式函數(shù)。最后一個(gè)參數(shù)列表17五、隱式參數(shù)5.2舉例classPreferredPrompt(valpreference:String)
classPreferredDrink(valpreference:String)
objectGreeter{
defgreet(name:String)(implicitprompt:PreferredPrompt,
drink:PreferredDrink)={
println("Welcome,"+name+".Thesystemisready.")
print("Butwhileyouwork,")
println("whynotenjoyacupof"+drink.preference+"?")
println(prompt.preference)
}
}
objectJoesPrefs{
implicitvalprompt=newPreferredPrompt("Yes,master>")
implicitvaldrink=newPreferredDrink("tea")
}隱式參數(shù)列表隱式對(duì)象18五、隱式參數(shù)缺省隱式參數(shù)列表,編譯器會(huì)嘗試自動(dòng)插入相應(yīng)的隱式定義。5.3使用方式一scala>importJoesPrefs._
importJoesPrefs._
scala>Greeter.greet("Joe")
Welcome,Joe.Thesystemisready.
Butwhile
youwork,whynotenjoyacupoftea?
Yes,master>scala>Greeter.greet("Joe")
<console>:12:error:couldnotfindimplicitvalueforparameterprompt:PreferredPrompt
Greeter.greet("Joe")
^缺省隱式參數(shù)列表19五、隱式參數(shù)也可以顯式給出參數(shù),但是要么全部缺省,要么全部顯式給出,不能只寫(xiě)一部分。5.4使用方式二scala>Greeter.greet("Joe")(prompt,drink)
Welcome,Joe.Thesystemisready.
Butwhile
youwork,whynotenjoyacupoftea?
Yes,master>
scala>Greeter.greet("Joe")(prompt)
<console>:15:error:notenoughargumentsformethodgreet:(implicitprompt:PreferredPrompt,implicitdrink:PreferredDrink)Unit.
Unspecifiedvalueparameterdrink.
Greeter.greet("Joe")(prompt)顯式提供參數(shù)部分缺省20六、含有隱式參數(shù)的主構(gòu)造方法
21六、含有隱式參數(shù)的主構(gòu)造方法6.1聲明方式classA(implicit
valx:Int)不僅是普通的函數(shù)可以有隱式參數(shù),類(lèi)的主構(gòu)造方法也可以包含隱式參數(shù)。輔助構(gòu)造方法是不允許出現(xiàn)隱式參數(shù)的。22六、含有隱式參數(shù)的主構(gòu)造方法如果類(lèi)A僅有一個(gè)參數(shù)列表,且是隱式的,那么A的實(shí)際定義形式是“A()(implicit參數(shù))”。若調(diào)用主構(gòu)造方法時(shí)顯式給出隱式參數(shù),就必須寫(xiě)出這個(gè)空括號(hào)。6.2使用細(xì)節(jié)一scala>classA(implicitvalx:Int)
definedclassA
scala>vala=newA(1)
<console>:12:error:noargumentsallowedfornullaryconstructorA:()(implicitx:Int)A
vala=newA(1)
^scala>vala=newA()(1)
a:A=A@7cf8f45a23六、含有隱式參數(shù)的主構(gòu)造方法若隱式參數(shù)由編譯器自動(dòng)插入,則空括號(hào)可有可無(wú)。6.3使用細(xì)節(jié)二scala>implicitvalORZ=233
ORZ:Int=233
scala>valb=newA
b:A=A@7d977a20
scala>b.x
res0:Int=233scala>valc=newA()
c:A=A@de0c402
scala>c.x
res1:Int=23324七、上下文界定
25七、上下文界定假設(shè)現(xiàn)在需要編寫(xiě)一個(gè)方法尋找“最大”的列表元素,并且具體行為會(huì)根據(jù)某個(gè)隱式Ordering[T]對(duì)象發(fā)生改變,那么可能定義如下:7.1maxList[T]函數(shù)的常規(guī)寫(xiě)法defmaxList[T](elements:List[T])(implicitordering:Ordering[T]):T=
elementsmatch{
caseList()=>thrownewIllegalArgumentException("emptylist!")
caseList(x)=>x
casex::rest=>
valmaxRest=maxList(rest)(ordering)//參數(shù)ordering被顯式傳遞
if(ordering.gt(x,maxRest))x//參數(shù)ordering被顯式使用
elsemaxRest
}26七、上下文界定隱式導(dǎo)入的Predef對(duì)象里定義了下面這樣一個(gè)函數(shù):defimplicitly[T](implicitt:T)=t在缺省參數(shù)的情況下,編譯器會(huì)在當(dāng)前作用域下自動(dòng)尋找一個(gè)T類(lèi)型的隱式對(duì)象傳遞給參數(shù)t,然后把這個(gè)對(duì)象返回。例如,implicitly[ORZ]就會(huì)把當(dāng)前作用域下的隱式ORZ對(duì)象返回。7.2implicitly[T]函數(shù)27七、上下文界定7.3maxList[T]函數(shù)使用implicitly[T]的簡(jiǎn)潔寫(xiě)法defmaxList[T](elements:List[T])(implicitordering:Ordering[T]):T=
elementsmatch{
caseList()=>thrownewIllegalArgumentException("emptylist!")
caseList(x)=>x
casex::rest=>
valmaxRest=maxList(rest)
if(implicitly[Ordering[T]].gt(x,maxRest))x
elsemaxRest
}28七、上下文界定[T:Ordering]7.4上下文界定語(yǔ)法7.5上下文界定的兩層含義defmaxList[T:Ordering](elements:List[T]):TdefmaxList[T](elements:List[T])(implicitordering:Ordering[T]):T引入一個(gè)類(lèi)型參數(shù)T添加一個(gè)類(lèi)型為Ordering[T]的隱式參數(shù)29七、上下文界定7.6maxList[T]函數(shù)使用[T:Ordering]的簡(jiǎn)潔寫(xiě)法defmaxList[T:Ordering](elements:List[T]):T=
elementsmatch{
caseList()=>thrownewIllegalArgumentException("emptylist!")
caseList(x)=>x
casex::rest=>
valmaxRest=maxList(rest)
if(implicitly[Ordering[T]].gt(x,maxRest))x
elsemaxRest
}上下文界定30八、多個(gè)匹配的隱式定義
31八、多個(gè)匹配的隱式定義8.1模棱兩可的隱式定義scala>classA(implicitvalx:Int)
definedclassA
scala>implicitvalz=10
z:Int=10
scala>implicitvalzz=100
zz:Int=100
scala>vala=newA()
<console>:14:error:ambiguousimplicitvalues:
bothvaluezoftype=>Int
andvaluezzoftype=>Int
matchexpectedtypeInt
vala=newA()
^兩個(gè)隱式變量都符合作為類(lèi)A主構(gòu)造函數(shù)的參數(shù)的條件32八、多個(gè)匹配的隱式定義8.2更具體的定義---條件1該定義的類(lèi)型是更模糊的定義的子類(lèi)型。scala>classA(implicitvalx:Int)
definedclassA
scala>implicitvalz=10
z:Int=10
scala>implicitvalzz:Any=100
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職(化妝品技術(shù))化妝品配方基礎(chǔ)試題及答案
- 2025年大學(xué)人類(lèi)學(xué)(人類(lèi)學(xué)基礎(chǔ))期末試題
- 2025年中職(會(huì)展服務(wù)與管理)會(huì)展現(xiàn)場(chǎng)服務(wù)階段測(cè)試題及答案
- 2025年大學(xué)動(dòng)畫(huà)設(shè)計(jì)(動(dòng)畫(huà)制作基礎(chǔ))試題及答案
- 2025年中職農(nóng)業(yè)機(jī)械使用與維護(hù)(農(nóng)機(jī)操作基礎(chǔ))試題及答案
- 2025年高職航空油料管理和應(yīng)用(油料管理技術(shù))試題及答案
- 2025年大學(xué)(護(hù)理學(xué))護(hù)理信息學(xué)試題及答案
- 2025年大學(xué)(車(chē)輛工程)汽車(chē)電子技術(shù)試題及答案
- 2026年食品營(yíng)養(yǎng)與檢驗(yàn)教育(食品檢驗(yàn)教育)考題及答案
- 2026年成都農(nóng)業(yè)科技職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)筆試備考題庫(kù)帶答案解析
- 邢臺(tái)課件教學(xué)課件
- 醫(yī)防融合視角下家庭醫(yī)生簽約慢病管理策略
- 2025年新能源市場(chǎng)開(kāi)發(fā)年度總結(jié)與戰(zhàn)略展望
- 中職歷史期末考試及答案
- 從指南看慢性乙型病毒性肝炎的防治策略
- 江蘇省揚(yáng)州市江都區(qū)2025-2026學(xué)年八年級(jí)第一學(xué)期第二次月考語(yǔ)文答案
- 互聯(lián)網(wǎng)企業(yè)績(jī)效考核方案與實(shí)施細(xì)則
- 2026年遼寧裝備制造職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)帶答案詳解
- 貴州興義電力發(fā)展有限公司2026年校園招聘?jìng)淇碱}庫(kù)及1套完整答案詳解
- 2026年及未來(lái)5年市場(chǎng)數(shù)據(jù)中國(guó)電磁兼容測(cè)試市場(chǎng)競(jìng)爭(zhēng)格局及投資戰(zhàn)略規(guī)劃報(bào)告
- 公安內(nèi)務(wù)條令課件
評(píng)論
0/150
提交評(píng)論