1. 程式人生 > >[筆記遷移][Spark開發語言][Scala][10]面向物件——型別引數

[筆記遷移][Spark開發語言][Scala][10]面向物件——型別引數

  1. Scala型別引數與Java的泛型引數的概念一致

  2. 泛型類
    (1) 定義:在類名的後面跟上型別引數列表,用[]包裹
    (2) 案例
    ClassArgsForclass

    (3) Scala可以根據第一欄位型別自動推斷泛型型別

  3. 泛型引數
    (1) 定義:在方法名後跟上型別引數列表,用[]包裹
    (2) 案例
    ClassArgsFormethod

    (3) 泛型函式一樣可以自動推斷型別

  4. 上邊界Bounds
    (1) 類似Java的<T extends xxx>,即泛型型別必須是xxx及其子類
    (2) 定義形式:[T <: xxx]
    (3) 案例
    HighBounds

  5. 下邊界Bounds
    (1) 類似Java的<T super xxx>,即泛型型別必須是xxx及其超類
    (2) 定義形式: [T >: xxx]

  6. View bounds
    (1) 上下界Bounds的加強版,支援對型別進行隱式轉換。將特定的型別進行隱式轉換後,再判斷是否在邊界指定類型範圍內
    (2) 定義形式:隱式轉換函式+[T <% xxx]
    (3) 案例
    ViewBounds

  7. Context Bounds
    (1) 特殊Bounds,需要使用上下文中的隱式值以及注入
    (2) 定義形式:[T:型別],且必須存在一個“型別[T]”的隱式值
    (3)案例
    ContextBounds

  8. Manifest Context Bounds
    (1) Scala中,如果要例項化一個泛型陣列,就必須使用Manifest Context Bounds

    (2) 定義形式:若陣列元素型別為T的話,則需要為類或函式定義[T:Manifest]泛型型別,才能例項化Array[T]這種泛型陣列

    (3) 案例
    ManifestContextBounds

  9. 泛型的協變和逆變
    (1) 引例:在Java中,如果有Professional是Master的子類,Card<Professional>卻不是Card<Master>的子類

    (2) 定義形式
    <1> 協變:A[+T],表示A[T]的繼承結構與T的繼承結構順序一致,向下多型
    <2> 逆變:A[-T],表示A[T]的繼承結構與T的繼承結構相反,向上推出,父子狀態交換

    (3) 案例
    Vary

  10. Existential Type
    (1) Spark中最為常見
    (2) 相當於Java的泛型萬用字元 “?”