Scala Type Parameters 2

来源:https://www.cnblogs.com/yuanzam/archive/2019/10/09/11645056.html
-Advertisement-
Play Games

類型關係 Scala 支持在泛型類上使用型變註釋,用來表示覆雜類型、組合類型的子類型關係間的相關性 協變 ,變化方向相同,通常用在生產 假設 , 對於 ,則 也可看做 由於 Scala 標準庫中不可變 的定義為 ,因此 是 的子類型, 也是 的子類型,所以可直接將他們當作 使用。 逆變 ,變化方向相 ...


  • 類型關係

    Scala 支持在泛型類上使用型變註釋,用來表示覆雜類型、組合類型的子類型關係間的相關性

    • 協變 +T,變化方向相同,通常用在生產

      假設 A extends T, 對於 Clazz[+T],則 Clazz[A] 也可看做 Clazz[T]

      // 官網示例
      abstract class Animal {
        def name: String
      }
      case class Cat(name: String) extends Animal
      case class Dog(name: String) extends Animal

      由於 Scala 標準庫中不可變 List 的定義為 List[+A],因此 List[Cat]List[Animal] 的子類型, List[Dog] 也是 List[Animal] 的子類型,所以可直接將他們當作 List[Animal] 使用。

      // 官網示例
      object CovarianceTest extends App {
        def printAnimalNames(animals: List[Animal]): Unit = {
          animals.foreach { animal =>
            println(animal.name)
          }
        }
      
        val cats: List[Cat] = List(Cat("Whiskers"), Cat("Tom"))
        val dogs: List[Dog] = List(Dog("Fido"), Dog("Rex"))
      
        printAnimalNames(cats)
        // Whiskers
        // Tom
      
        printAnimalNames(dogs)
        // Fido
        // Rex
      }
    • 逆變 -T,變化方向相反,通常用在消費

      假設 A extends T, 對於 Clazz[-T],則 Clazz[T] 也可看做 Clazz[A]

      // 官網示例
      abstract class Printer[-A] {
        def print(value: A): Unit
      }
      
      class AnimalPrinter extends Printer[Animal] {
        def print(animal: Animal): Unit =
          println("The animal's name is: " + animal.name)
      }
      
      class CatPrinter extends Printer[Cat] {
        def print(cat: Cat): Unit =
          println("The cat's name is: " + cat.name)
      }
      
      object ContravarianceTest extends App {
        val myCat: Cat = Cat("Boots")
      
        def printMyCat(printer: Printer[Cat]): Unit = {
          printer.print(myCat)
        }
      
        val catPrinter: Printer[Cat] = new CatPrinter
        val animalPrinter: Printer[Animal] = new AnimalPrinter
      
        printMyCat(catPrinter)
        printMyCat(animalPrinter) // 將 Printer[Animal] 當作 Printer[Cat] 使用
      }

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

-Advertisement-
Play Games
更多相關文章
  • 這是 Java 網路爬蟲系列博文的第二篇,在上一篇 "Java 網路爬蟲,就是這麼的簡單" 中,我們簡單的學習了一下如何利用 Java 進行網路爬蟲。在這一篇中我們將簡單的聊一聊在網路爬蟲時,遇到需要登錄的網站,我們該怎麼辦? 在做爬蟲時,遇到需要登陸的問題也比較常見,比如寫腳本搶票之類的,但凡需要 ...
  • 一、楔子 你現在已經學會了寫python代碼,假如你寫了兩個python文件a.py和b.py,分別去運行,你就會發現,這兩個python的文件分別運行的很好。但是如果這兩個程式之間想要傳遞一個數據,你要怎麼做呢? 這個問題以你現在的知識就可以解決了,我們可以創建一個文件,把a.py想要傳遞的內容寫 ...
  • ① 向資料庫發送SQL查詢語句 首先使用Statement聲明一個SQL語句對象,然後讓已創建的連接對象con調用方法createStatement()創建SQL語句對象。 Statement sql = con.createStatement(); Connection con = null; S ...
  • 一、主方法註意 每一個類都可以編寫一個主方法,但是一般情況下,一個系統只有一個入口,所以主方法一般寫一個 二、Myeclipse的使用 1.在workspace中工作區中有一個文件夾.metadata:在該文件夾中存儲了當前MyEclipse的工作狀態 2.將.metadata文件夾刪除之後,下一次 ...
  • 本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫里查看 https://github.com/h2pl/Java Tutorial 喜歡的話麻煩點下Star哈 文章首發於我的個人博客: www.how2playlife.com <! more 從JVM結構開始 ...
  • 本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫里查看 https://github.com/h2pl/Java Tutorial 喜歡的話麻煩點下Star哈 文章首發於我的個人博客: www.how2playlife.com <! more 本文參考 htt ...
  • 本文的記憶體模型只寫虛擬機記憶體模型,物理機的不予描述。 Java記憶體模型 在Java中,虛擬機將運行時區域分成6中,如下圖: 由於類和方法的信息難以確定,不好設定大小,太大則影響年老代,太小容易記憶體溢出。 GC不好處理,回收效率低下,調優困難。 在上面的6種類型中,前三種是線程私有的,也就是說裡面存放 ...
  • 本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫里查看 https://github.com/h2pl/Java Tutorial 喜歡的話麻煩點下Star哈 文章首發於我的個人博客: www.how2playlife.com <! more 這是一個Java ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...