Scala Type Parameters 1

来源:https://www.cnblogs.com/yuanzam/archive/2019/10/08/11638643.html

類型參數 表現形式:在名稱後面以方括弧表示, 何處使用 class 中,用於定義變數、入參、返回值 函數、方法 類型邊界 上邊界 compareTo Comparable` 的子類型,即需要添加上邊界 scala class Pair[T : LowerBound` 替換第一個元素為 T 的父類 R ...


類型參數

  • 表現形式:在名稱後面以方括弧表示, Array[T]
  • 何處使用
    • class 中,用於定義變數、入參、返回值

      class Pair[T, S](val first: T, val second: S)
      // scala 可自動推斷具體的類型
      val p = new Pair(42, "String") // Pair[Int, String]
    • 函數、方法

      def getMiddle[T](a: Array[T]) = a(a.length / 2)
  • 類型邊界

    • 上邊界 T <: UpperBound

      // 比較大小
      class Pair[T](val first: T, val second: T) {
        def smaller = if (first.compareTo(second) < 0) first else second  
      }

      無法確定 first 是否存在 compareTo 方法,所以必須添加約束,fist 必須是 Comparable 的子類型,即需要添加上邊界

      class Pair[T <: Comparable[T]](val first: T, val second: T) {
        def smaller = if (first.compareTo(second) < 0) first else second
      }
    • 下邊界 T >: LowerBound

      // 替換第一個元素
      class Pair[T](val first: T, val second: T) {
        def replaceFirst(newFirst: T) = new Pair[T](newFirst, second)
      }

      替換第一個元素為 T 的父類 R,那麼返回類型是什麼? 如果需要返回 R,則需要添加約束,即需要下邊界;否則返回的類型為 Any

      // 返回類型自動推斷為 new Pair[R]
      def replaceFirst[R >: T](newFirst: R) = new Pair(newFirst, second)
    • 上下文邊界 T : ContextBound

      Scala 2.8 對 Array 進行了更新優化,使用隱式轉換和 manifest 將數組整合為 Scala 的集合庫

      def tabulate[T](len: Int, f: Int => T)(implicitm: ClassManifest[T]) = {
        val xs = new Array[T](len)
        for(i <- 0 until len) xs(i) = f(i)
        xs
      }
      
      // 簡化後
      def tabulate[T: ClassManifest](len: Int, f: Int => T) = {
        val xs = new Array[T](len)
        for(i <- 0 until len) xs(i) = f(i)
        xs
      }
      • ClassTag, 指定運行時的類型,如 Array[Int] 在運行時想指定為 int[]

        import scala.reflect._
        def makePair[T : ClassTag](first: T, second: T) = {
          val r = new Array[T](2); r(0) = first; r(1) = second; r
        }
        
        makePair(4, 9)
        
        // 實際調用
        makePair(4, 9)(classTag)
        
        // new 操作,即 ClassTag[Int] 構建原始類型數組 int[2]
        classTag.newArray
    • 多個邊界
      • 可同時添加上界和下界 T >: Lower <: Upper
      • 不可添加多個上界或多個下屆,但可實現多個 trait,
        • T <: Comparable[T] with Serializable with Cloneable
      • 可指定多個上下文邊界 T : Ordering : ClassTag
  • 類型約束
    • 測試是否相等 T =:= U
    • 測試是否為子類 T <:< U
    • 測試是否可轉換 T => U

    要添加該約束,需添加隱式參數

    // 約束類
    class Pair[T](val first: T, val second: T)(implicit ev: T <:< Comparable[T])
    
    // 約束方法調用,只有類型滿足才能調用成功,否則報錯
    class Pair[T](val first: T, val second: T) {
      def smaller(implicit ev: T <:< Ordered[T]) =
        if (first < second) first else second
    }
    
    // 便於類型推斷
    def firstLast[A, C <: Iterable[A]](it: C) = (it.head, it.last)
    // 無法推斷類型 A
    firstLast(List(1, 2, 3)) // [Nothing, List[Int]]
    // 添加約束關係
    def firstLast[A, C](it: C)(implicit ev: C <:< Iterable[A]) = (it.head, it.last)

您的分享是我們最大的動力!

更多相關文章
  • 一、概述 單例模式是設計模式中相對簡單且非常常見的一種設計模式,但是同時也是非常經典的 高頻 面試題,相信還是有很多人在面試時會掛在這裡。本篇文章主要針對單例模式做一個回顧,記錄單例模式的應用場景、常見寫法、針對線程安全進行調試(看得見的線程)以及總結。相信大家看完這篇文章之後,對單例模式有一個非常 ...
  • 原文地址: "梁桂釗的博客" 博客地址: "http://blog.720ui.com" 歡迎關註公眾號:「服務端思維」。一群同頻者,一起成長,一起精進,打破認知的局限性。 漫談 GOF 設計模式在 Spring 框架中的實現 在開始正文之前,請你先思考幾個問題: 你項目中有使用哪些 GOF 設計模 ...
  • Josephus問題,在這個古老的問題中,N個深陷絕境的人一致同意通過以下方式減少生存的人數。他們圍坐一圈(位置記為0~N-1)並從第一個人報數,報到M的人會被殺死, 知道最後一個人留下來。傳說中Josephus找到了不會被殺死的位置。 接收N和M的值,列印出被殺死的順序: ...
  • 一、IDE上繼續新建工程 1.在src目錄下新建軟體包:package機制後面再講,目前先用著 2.給package命名一個名稱:com.bjpowernode.java_learning 3.軟體包下新建一個類 4.軟體包是Java語法中的一部分,後面再講 面向對象的封裝性 二、快捷鍵 CTRL ...
  • 1. 基本類型包裝類 大家回想下,在第三篇文章中我們學習Java中的基本數據類型時,說Java中有8種基本的數據類型,可是這些數據是基本數據,想對其進行複雜操作,變的很難。怎麼辦呢? 1.1 基本類型包裝類概述 在實際程式使用中,程式界面上用戶輸入的數據都是以字元串類型進行存儲的。而程式開發中,我們 ...
  • 1. 快速入門 (1)我們從官網下載源碼 BCrypt 官網 http://www.mindrot.org/projects/jBCrypt/ (2)新建工程,將源碼類BCrypt拷貝到工程 (3)新建測試類,main方法中編寫代碼,實現對密碼的加密 String gensalt = BCrypt. ...
  • 1. 正則表達式 1.1 正則表達式的概念 正則表達式(英語:Regular Expression,在代碼中常簡寫為regex)。 正則表達式是一個字元串,使用單個字元串來描述、用來定義匹配規則,匹配一系列符合某個句法規則的字元串。在開發中,正則表達式通常被用來檢索、替換那些符合某個規則的文本。 1 ...
  • 1989,為了度過聖誕假期,Guido開始編寫Python語言編譯器。Python這個名字來自Guido的喜愛的電視連續劇《蒙蒂蟒蛇的飛行馬戲團》。他希望新的語言Python能夠滿足他在C和Shell之間創建全功能、易學、可擴展的語言的願景。 今天,世界上有將近600種編程語言,但也有20種流行語言 ...
一周排行
  • 1. 雲停車 (開篇)2. 雲停車 (硬體篇)3. 雲停車 (業務篇)4. 雲停車 (平臺篇)5. 雲停車 (源碼篇) 網址:http://42.194.142.223:8091/Home 賬戶:admin 密碼:[email protected] 在場記錄 出入記錄 月租車繳費記錄 臨時車繳費記錄 車場 ...
  • 1.RabbitMQ簡介 因為RabbitMQ是基於開源的AMQP協議來實現的,所以在瞭解MQ時候,首先我們來瞭解下AMQP協議。AMQP,即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的 ...
  • 1.AMQP Messaging中的基本概念 Broker:接收和分發消息的應用,RabbitMQ Server就是Message Broker。Virtual Host:出於多租戶和安全因素設計的,把AMQP的基本組件劃分到一個虛擬的分組中,類似於網路中的Namespace概念。當多個不同的用戶使 ...
  • 在顯示或者隱藏視窗的時候,可以利用Windows API中的AnimateWindow函數實現一些特殊的效果。主要的動畫類型有四種:滾動、幻燈片、摺疊或展開和alpha混合漸變。 ##視窗動畫效果 首先定義動畫工具類,引入AnimateWindow函數。 public class WindowsEf ...
  • 泥水佬大佬的地址已經不能下載,所以分享下。 用法很簡單,輸入地址即可。 鏈接:https://pan.baidu.com/s/1OUeybjqY9uGWmxe_ywgwgQ 提取碼:nls9 ...
  • //前提需要 //需要一個 serialPort 工具 可在vs自帶的工具欄中獲得 //源代碼加串口工具地址: //鏈接:https://pan.baidu.com/s/1YbfvdXEmfsJX87D-Jxljyg 提取碼:d32x //記錄用戶打開的串口號 可改為泛型模式 string seri ...
  • 從業務視角還原問題、業務視角抽象問題、二次抽象發現技術問題,作為思考問題的三個還原點。 提煉單點問題解決能力、思考單點問題解決能力,複製、層層遞進思考問題,從深度和廣度出發, 深度以數據作指標,廣度以領域做方向。 腳踏實地的代碼量成長沒有捷徑。 ...
  • Java電子書分類 Java、Spring、SpringBoot、SpringCloud、mybatis、Tomcat、多線程、Git相關、Redis、設計模式、Nginx、Linux、演算法、資料庫、大數據、架構 電子書大概有30G左右 部分電子書截圖 領取方式 加我的微信(s2001sssss)免 ...
  • 一.node啟動js公鑰加密 //需要導入模塊npm install node-forge var arguments = process.argv.splice(2); // console.log('所傳遞的參數是:', arguments); var e = arguments[1]; var ...
  • LeetCode–最長公共首碼 博客說明 文章所涉及的資料來自互聯網整理和個人總結,意在於個人學習和經驗彙總,如有什麼地方侵權,請聯繫本人刪除,謝謝! 說明 leetcode題,14題 最長公共首碼 題目 編寫一個函數來查找字元串數組中的最長公共首碼。 如果不存在公共首碼,返回空字元串 ""。 示例 ...