型別引數是什麼?型別引數其實就類似於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...