[筆記遷移][Spark開發語言][Scala][10]面向物件——型別引數
-
Scala型別引數與Java的泛型引數的概念一致
-
泛型類
(1) 定義:在類名的後面跟上型別引數列表,用[]包裹
(2) 案例
(3) Scala可以根據第一欄位型別自動推斷泛型型別
-
泛型引數
(1) 定義:在方法名後跟上型別引數列表,用[]包裹
(2) 案例
(3) 泛型函式一樣可以自動推斷型別
-
上邊界Bounds
(1) 類似Java的<T extends xxx>,即泛型型別必須是xxx及其子類
(2) 定義形式:[T <: xxx]
(3) 案例
-
下邊界Bounds
(1) 類似Java的<T super xxx>,即泛型型別必須是xxx及其超類
(2) 定義形式: [T >: xxx] -
View bounds
(1) 上下界Bounds的加強版,支援對型別進行隱式轉換。將特定的型別進行隱式轉換後,再判斷是否在邊界指定類型範圍內
(2) 定義形式:隱式轉換函式+[T <% xxx]
(3) 案例
-
Context Bounds
(1) 特殊Bounds,需要使用上下文中的隱式值以及注入
(2) 定義形式:[T:型別],且必須存在一個“型別[T]”的隱式值
(3)案例
-
Manifest Context Bounds
(1) Scala中,如果要例項化一個泛型陣列,就必須使用Manifest Context Bounds(2) 定義形式:若陣列元素型別為T的話,則需要為類或函式定義[T:Manifest]泛型型別,才能例項化Array[T]這種泛型陣列
(3) 案例
-
泛型的協變和逆變
(1) 引例:在Java中,如果有Professional是Master的子類,Card<Professional>卻不是Card<Master>的子類(2) 定義形式
<1> 協變:A[+T],表示A[T]的繼承結構與T的繼承結構順序一致,向下多型
<2> 逆變:A[-T],表示A[T]的繼承結構與T的繼承結構相反,向上推出,父子狀態交換(3) 案例
-
Existential Type
(1) Spark中最為常見
(2) 相當於Java的泛型萬用字元 “?”