敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第17章 類型參數(shù)化_第1頁
敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第17章 類型參數(shù)化_第2頁
敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第17章 類型參數(shù)化_第3頁
敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第17章 類型參數(shù)化_第4頁
敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第17章 類型參數(shù)化_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

17.類型參數(shù)化一、var類型的字段二、類型構(gòu)造器三、型變注解四、檢查型變注解五、類型構(gòu)造器的繼承關(guān)系六、上下界七、方法的類型參數(shù)八、對象私有數(shù)據(jù)目

2Why?問題:無法預(yù)知對象的類型寫新的類工作量巨大解決方法:泛型——類型參數(shù)化優(yōu)點(diǎn):實(shí)例化生成不同的類對象,從而避免了很大的工作量例如:Array[T]、List[T]、Map[T,U]注意:只有類和特質(zhì)可以進(jìn)行類型參數(shù)化

3一、var類型的字段

4執(zhí)行兩個(gè)基本操作:獲取字段值或者設(shè)置為一個(gè)新值編譯器會(huì)隱式地把這個(gè)變量限制成private[this]的訪問權(quán)限,同時(shí)隱式地定義一個(gè)名為“變量名”的getter方法,和一個(gè)名為“變量名_=”的setter方法classA{

varaInt:Int=_

}

//相當(dāng)于

classA{

private[this]vara:Int=_

defaInt:Int=a

defaInt_=(x:Int)=a=x

}一、var類型的字段基本介紹

5外部讀取和修改var字段轉(zhuǎn)換成對getter和setter方法的調(diào)用也可以自定義getter和setter方法,以及一個(gè)private[this]修飾的var類型字段字段與方法沒有必然聯(lián)系如果自定義了這兩種方法,卻不一定要相應(yīng)的var字段與之對應(yīng),這兩個(gè)方法也可以操作類內(nèi)的其他成員且可以調(diào)用一、var類型的字段基本介紹

6二、類型構(gòu)造器7泛型的意思就是泛指某種數(shù)據(jù)類型在scala中,泛型用[數(shù)據(jù)類型]表示泛型一般是結(jié)合數(shù)組或者集合來使用泛型主要包括了泛型方法,泛型類以及泛型特質(zhì)二、類型構(gòu)造器2.1泛型2.2泛型類泛型類指的是把泛型定義到類的聲明上,即類中的成員的參數(shù)類型是由泛型來決定的,在創(chuàng)建對象時(shí),明確具體的數(shù)據(jù)類型class

類[T]

{val

變量名:

T}

8scala>abstractclassA[T]{

|vala:T

|}

classA

scala>defdoesNotCompile(x:A)={}

^

error:classAtakestypeparameters

scala>defdoesCompile(x:A[AnyRef])={}

defdoesCompile:(x:A[AnyRef])Unit二、類型構(gòu)造器A是一個(gè)類,被稱為“類型構(gòu)造器”不能只寫一個(gè)類名給出具體的類型參數(shù)實(shí)例

9三、型變注解103.1基本內(nèi)容A[T]這樣的類型構(gòu)造器,它們的類型參數(shù)T可以是協(xié)變的、逆變的或者不變的A[+T]表示類A在類型參數(shù)T上是協(xié)變的A[-T]表示類A在類型參數(shù)T上是逆變的類型參數(shù)的前綴“+”和“-”被稱為型變注解,沒有就是不變的三、型變注解

113.2關(guān)系圖關(guān)系變?yōu)槟?,與原關(guān)系反轉(zhuǎn)關(guān)系保持不變。沒有任何關(guān)系,不同類型三、型變注解

12四、檢查型變注解13

標(biāo)注了型變注解的類型參數(shù)不能隨意使用,類型系統(tǒng)設(shè)計(jì)要滿足“里氏替換原則”里氏替換原則的依據(jù)是子類型多態(tài)超類的變量可以指向子類的對象,因?yàn)樽宇惱^承了超類所有非私有成員,能在超類中使用的成員,一般在子類中均可使用四、檢查型變注解4.1基本內(nèi)容

14類型T(超類)類型S(子類)A[T](超類)

A[S](子類)

四、檢查型變注解4.2方法中的型變注解vala:A[T]=newA[S]不合法a.funcA(b:T)valc:T=a.funcA()協(xié)變類型:合法

15Scala的編譯器把類或特質(zhì)中任何出現(xiàn)類型參數(shù)的地方都當(dāng)作一個(gè)點(diǎn),點(diǎn)有協(xié)變點(diǎn)、逆變點(diǎn)和不變點(diǎn)之分,以聲明類型參數(shù)的類和特質(zhì)作為頂層開始,逐步往內(nèi)層深入更深一層的嵌套的點(diǎn)與在包含嵌套的外一層的點(diǎn)被歸為一類三種特殊情況:

①方法的值參數(shù)所在的點(diǎn)會(huì)根據(jù)方法外的點(diǎn)進(jìn)行一次翻轉(zhuǎn)②方法的類型參數(shù)也會(huì)根據(jù)方法外的點(diǎn)進(jìn)行一次翻轉(zhuǎn)③如果類型也是一個(gè)類型構(gòu)造器,會(huì)根據(jù)T的注解進(jìn)行翻轉(zhuǎn)雖然型變注解的檢查很麻煩,但這些工作都被編譯器自動(dòng)完成了四、檢查型變注解4.3編譯器判斷規(guī)則Q[+U,-T,V]

16五、類型構(gòu)造器的繼承關(guān)系17對于單個(gè)類型參數(shù)的類型構(gòu)造器而言,繼承關(guān)系很好判斷,只需要看型變注解是協(xié)變、逆變還是不變traitFunction1[-S,+T]{

defapply(x:S):T

}五、類型構(gòu)造器的繼承關(guān)系5.1單個(gè)類型參數(shù)S是入?yún)?shù),逆變T代表返回值,協(xié)變多個(gè)類型參數(shù)怎么辦呢?

18類型A(超類)類型a(子類)類型B(超類)類型b(子類)

5.2多類型參數(shù)

Function1[a,B]Function1[A,b]子類結(jié)論:把逆變類型參數(shù)由子類替換成超類、把協(xié)變類型參數(shù)由超類替換成子類五、類型構(gòu)造器的繼承關(guān)系

19六、上下界206.1上界對于類型構(gòu)造器A[-T],上界的形式為“U<:T”表示給類型添加一個(gè)上界,表示泛型參數(shù)必須要從該類(或本身)繼承六、上下界

21scala>abstractclassA[-T]{

|deffuncA[U<:T](x:U):U

|}

definedclassA6.2下界對于類型構(gòu)造器A[+T],下界的形式為“U>:T”表示給類型添加一個(gè)下界,表示泛型參數(shù)是該類型本身或者類型的超類如果既有下界又有上界。那么下界寫在前面,上界寫在后面六、上下界

22scala>abstractclassA[+T]{

|deffuncA[U>:T](x:U):U

|}

definedclassA七、方法的類型參數(shù)23方法也可以帶有類型參數(shù)當(dāng)方法僅僅使用了包含它的類或特質(zhì)中的類型參數(shù)時(shí),那么方法就沒必要寫出類型參數(shù)使用了未聲明的類型參數(shù),則必須寫在方法的類型參數(shù)里七、方法的類型參數(shù)不能有型變注解!!不能與已聲明的類型參數(shù)一樣!!

24八、對象私有數(shù)據(jù)25八、對象私有數(shù)據(jù)8.1var字段類型參數(shù)var類型的字段,類型參數(shù)不能是協(xié)變的,因?yàn)殡[式的setter方法需要一個(gè)入?yún)㈩愋蛥?shù)也不能是逆變的,因?yàn)殡[式的getter方法的返回類型就是字段的類型

26舉例:八、對象私有數(shù)據(jù)scala>classA[-T]{

|vara:T=_

|}

<console>:12:error:contravarianttypeToccurs

incovariantpositionintype=>Tofvariablea

vara:T=_

scala>classA[+T]{

|vara:T=_

}

vara:T=_

^

Online2:error:contravarianttypeToccursincovariantpositionintypeTofvariablea8.1var字段類型參數(shù)

27八、對象私有數(shù)據(jù)scala>classA[-T]{

|private[this]vara:T=_

|}

classA

scala>classA[-T]{

|private[this]vara:T=_

|}

classA如果var字段是對象私有的,即用private[this]修飾,那么它只能在定義該類或特質(zhì)時(shí)被訪問。此時(shí)gett

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論