scala快速入門系列【泛型】

        本篇做爲scala快速入門系列的第三十五篇博客,爲你們帶來的是關於泛型的內容。java

在這裏插入圖片描述

泛型

        scala和Java同樣,類和特質、方法均可以支持泛型。咱們在學習集合的時候,通常都會涉及到泛型。數組

在這裏插入圖片描述
        那如何本身定義泛型呢?markdown

定義一個泛型方法

        在scala中,使用方括號來定義類型參數。ide

語法
在這裏插入圖片描述函數

示例學習

  • 用一個方法來獲取任意類型數組的中間的元素
    – 不考慮泛型直接實現(基於Array[Int]實現)
    – 加入泛型支持

參考代碼測試

不考慮泛型的實現spa

在這裏插入圖片描述
加入泛型支持
在這裏插入圖片描述scala


泛型類

        scala的類也能夠定義泛型。接下來,咱們來學習如何定義scala的泛型類。3d

語法

在這裏插入圖片描述

  • 定義一個泛型類,直接在類名後面加上方括號,指定要使用的泛型參數
  • 指定類對應的泛型參數後,就使用這些類型參數來定義變量了

示例

  • 實現一個Pair泛型類
  • Pair類包含兩個字段,並且兩個字段的類型不固定
  • 建立不一樣類型泛型類對象,並打印

在這裏插入圖片描述

上下界

需求:

        咱們在定義方法/類的泛型時,限定必須從哪一個類繼承、或者必須是哪一個類的父類。此時,就須要使用到上下界

上界

        使用<:類型名錶示給類型添加一個上界,表示泛型參數必需要從該類(或自己)繼承。

語法
在這裏插入圖片描述

示例

  • 定義一個Person類
  • 定義一個Student類,繼承Person類
  • 定義一個demo泛型方法,該方法接收一個Array參數
  • 定義一個demo泛型方法,該方法接收一個Array參數
  • 測試調用demo,傳入不一樣元素類型的Array

參數代碼
在這裏插入圖片描述

下界

        上界是要求必須是某個類的子類,或者必須從某個類繼承,而下界是必須是某個類的父類(或自己)

語法
在這裏插入圖片描述
[NOTE]

  • 若是類既有上界、又有下界。下界寫在前面,上界寫在後面

示例

  • 定義一個Person類
  • 定義一個Policeman類,繼承Person類
  • 定義一個Superman類,繼承Policeman類
  • 定義一個demo泛型方法,該方法接收一個Array參數
  • 限定demo方法的Array元素類型只能是Person、Policeman
  • 測試調用demo,傳入不一樣元素類型的Array

參考代碼1

在這裏插入圖片描述
參考代碼2

object _04GenericType {

  // 1. 定義類和子類
  class Person
  class Policeman extends Person
  class Superman extends Policeman


  // 2. 定義泛型方法,指定泛型的類型上下界
  def demo[T >: Policeman <: Person](array: Array[T])={
    println(array)
  }

  // 3. 調用demo方法,傳入不一樣類型的數據進行測試
  def main(args: Array[String]): Unit = {
    demo(Array(new Person))
    demo(Array(new Policeman))
     
    // 編譯報錯:String類型並非Person類型或者是它的子類
    // demo(Array(new Superman))

  }
}

協變、逆變、非變

        spark的源代碼中大量使用到了協變、逆變、非變,學習該知識點對咱們未來閱讀spark源代碼頗有幫助。

來看一個類型轉換的問題:
在這裏插入圖片描述
        如何讓帶有泛型的類支持類型轉換呢?


非變

語法
在這裏插入圖片描述

  • 默認泛型類是非變
  • 類型B是A的子類型,Pair[A]和Pair[B]沒有任何從屬關係
  • Java是同樣的
    在這裏插入圖片描述

協變

語法
在這裏插入圖片描述

  • 類型B是A的子類型,Pair[B]能夠認爲是Pair[A]的子類型
  • 參數化類型的方向和類型的方向是一致的。

逆變

語法

在這裏插入圖片描述

  • 類型B是A的子類型,Pair[A]反過來能夠認爲是Pair[B]的子類型
  • 參數化類型的方向和類型的方向是相反的

示例

  • 定義一個Super類、以及一個Sub類繼承自Super類
  • 使用協變逆變非變分別定義三個泛型類
  • 分別建立泛型類來演示協變、逆變、非變

參考代碼
在這裏插入圖片描述


        本期的內容分享就到這裏了,喜歡的小夥伴們記得點個贊,持續關注喲~下期爲你們介紹的是scala的高階函數,敬請期待٩(๑>◡<๑)۶

在這裏插入圖片描述

相關文章
相關標籤/搜索