Scala 型別引數

2022-09-15 12:36:13 字數 2146 閱讀 9083

型別引數是什麼?型別引數其實就類似於j**a中的泛型。先說說

j**a

中的泛型是什麼,比如我們有

list a = new arraylist()

,接著a.add(1)

,沒問題,

a.add("2")

,然後我們

a.get(1) == 2

,對不對?肯定不對了,

a.get(1)

獲取的其實是個

string

——"2"

,string

——"2"

怎麼可能與乙個

integer

型別的2

相等呢?

所以j**a中提出了泛型的概念,其實也就是型別引數的概念,此時可以用泛型建立

list

,list a = new arraylist[integer]()

,那麼,此時

a.add(1)

沒問題,而

a.add("2")

呢?就不行了,因為泛型會限制,只能往集合中新增

integer

型別,這樣就避免了上述的問題。

那麼scala的型別引數是什麼?其實意思與

j**a

的泛型是一樣的,也是定義一種型別引數,比如在集合,在類,在函式中,定義型別引數,然後就可以保證使用到該型別引數的地方,就肯定,也只能是這種型別。從而實現程式更好的健壯性。

此外,型別引數是spark原始碼中非常常見的,因此同樣必須掌握,才能看懂

spark

原始碼。1、泛型類(案例:新生報到)

2、泛型函式(案例:卡片售賣機)

3、上邊界

bounds

(案例:在派對上交朋友)

4、下邊界

bounds

(案例:領身份證)

5、view bounds

(案例:跟小狗交朋友)

6、context bounds

(案例:使用

scala

內建的比較器比較大小)

7、manifest context bounds

(案例:打包飯菜)

8、協變和逆變(案例:進入會場)

9、existential type

// 泛型類,顧名思義,其實就是在類的宣告中,定義一些泛型型別,然後在類內部,比如

field

或者method

,就可以使用這些泛型型別。

// 使用泛型類,通常是需要對類中的某些成員,比如某些

field

和method

中的引數或變數,進行統一的型別限制,這樣可以保證程式更好的健壯性和穩定性。

// 如果不使用泛型進行統一的型別限制,那麼在後期程式執行過程中,難免會出現問題,比如傳入了不希望的型別,導致程式出問題。

// 在使用類的時候,比如建立類的物件,將型別引數替換為實際的型別,即可。

// scala自動推斷泛型型別特性:直接給使用了泛型型別的

field

賦值時,

scala

會自動進行型別推斷。

案例:新生報到,每個學生來自不同的地方,id可能是

int,可能是

string

class student[t](val localid: t)

implicit def dog2person(dog: object): person = if(dog.isinstanceof[dog]) else nil

class party[t

// context bounds是一種特殊的

bounds

,它會根據泛型型別的宣告,比如「

t: 型別」要求必須存在乙個型別為「型別

[t]」的隱式值。其實個人認為,

context bounds

之所以叫

context

,是因為它基於的是一種全域性的上下文,需要使用到上下文中的隱式值以及注入。

案例:使用scala內建的比較器比較大小

Scala 型別引數

型別引數是什麼?型別引數其實就類似於j a中的泛型。先說說 j a 中的泛型是什麼,比如我們有 list a new arraylist 接著a.add 1 沒問題,a.add 2 然後我們 a.get 1 2 對不對?肯定不對了,a.get 1 獲取的其實是個 string 2 string 2 ...

scala 引數型別推斷

package com.xcu.chapter13 object demo06 parameterinfer 傳入乙個匿名函式 println list.map x int x 1 體內只有一句話,可以省略 println list.map x x 1 引數型別可以推斷時,可以省略引數型別 prin...

Scala學習筆記 型別引數化陣列

scala看得頭痛,記一下筆記。valgreetstrings newarray string 3 greetstrings 0 hello greetstrings 1 greetstrings 2 world n for i 0to2 print greetstrings i 說明 1 scal...