Java中<? super T>和List<? extends T>的區別

Java中<? super T>和List<? extends T>的區別

<? extends T>

下面通配符聲明List<? extends Number> foo3的賦值式是合法的:

List<? extends Number> foo3 = new ArrayList<Number>();  // Number "extends" Number (in this context)
List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number
List<? extends Number> foo3 = new ArrayList<Double>();  // Double extends Number
  1. - 上面給出可能的賦值式,你能確保從List foo3讀取什么類型的對象?:
    • 你可以讀取一個Number,因為任意包含一個Number或一個Number子類的列表都可賦值于foo3
    • 你不可讀取一個Integer,因為foo3可以指List<Double>
    • 你不可讀取一個Double,因為foo3可以指List<Integer>
  2. - 上面給出可能的賦值式,你能添加什么類型的對象至List foo3?:
    • 你不能添加一個Integer,因為foo3可以指List<Double>
    • 你不能添加一個Double,因為foo3可以指List<Integer>
    • 你不能添加一個Number,因為foo3可以指List<Integer>

你不能將任何對象添加到List<? extends T>是因為你不能保證它真正指向的是哪種類型的列表,因此,你不能保證某對象在該列表中是允許的。唯一的“確保”是你只能從中讀取,你會得到一個T或者T的子類。

<? super T>

下面通配符聲明List<? super Number> foo3的賦值式是合法的:

List<? super Integer> foo3 = new ArrayList<Integer>();  // Integer is a "superclass" of Integer (in this context)
List<? super Integer> foo3 = new ArrayList<Number>();   // Number is a superclass of Integer
List<? super Integer> foo3 = new ArrayList<Object>();   // Object is a superclass of Integer
  1. - 上面給出可能的賦值式,你能確保從List foo3讀取什么類型的對象?:
    • 你不能確保讀取一個Integer,因為foo3可以指List<Number>List<Object>
    • 你不能確保讀取一個Number,因為foo3可以指List<Object>
    • 唯一能確定的是你能讀取一個ObjectObject子類的對象(但是你不知道具體哪個子類)。
  2. - 上面給出可能的賦值式,你能添加什么類型的對象至List foo3?:
    • 你可以添加一個IntegerInteger的子類。
    • 你不能添加一個Number,因為foo3可以指List<Integer>
    • 你不能添加一個Object,因為foo3可以指List<Integer>

PECS

記住PECS: “Producer Extends, Consumer Super”

  • "Producer Extends" - 如果你需要一個List來生產T值(你想從列表讀取T),你就用? extends T來聲明它,如List<? extends Integer>。但是你不能夠添加東西到列表中。
  • "Consumer Super" - 如果你需要一個List來消費T值(你想從列表寫入T),你就用? super T來聲明它,如List<? super Integer>。但是你能從列表讀取什么類型對象是不能確定的。
  • 如果你要列表讀寫兼顧,你就不要任何通配符聲明該列表,如List<Integer>

我的助記

  • PECS -> PE teacher taught me computer science.
  • extends du, super xie -> edsx -> 惡毒的思想

一個例子

public class Collections { public static <T> void copy(List<? super T> dest, List<? extends T> src) {for (int i = 0; i < src.size(); i++) dest.set(i, src.get(i)); }
}

關于該例更多說明。

參考資料

Difference between <? super T> and <? extends T> in Java

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445847.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445847.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445847.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql書寫規則_每天10分鐘帶你學會MySQL(二)SQL語句的基本書寫規則

SQL語句時必須要遵守一些規則。這些規則都非常簡單&#xff0c;接下來就讓我們逐一認識一下吧。1&#xff0c;SQL語句以分號(;)結尾。■SQL語句要以分號(;)結 尾一條SQL語句可以描述一個數據庫操作。在RDBMS當中&#xff0c;SQL語句也是逐條執行的。眾所周知&#xff0c;我們在…

《劍指Offer》52:兩個鏈表的第一個公共節點

題目 輸入兩個鏈表&#xff0c;找出它們的第一個公共節點。 public static class ListNode{public int val;public ListNode next;public ListNode(int val) {this.val val;} }分析 首先遍歷兩鏈表的長度。在第二次遍歷的時候&#xff0c;在較長的鏈表上先走若干步&#xf…

mysql win 64_win10下裝mysql-5.7.18-winx64

步驟1官網下載地址&#xff1a;https://dev.mysql.com/downloads/mysql/選擇手動安裝版&#xff1a;解壓到D盤mysql文件夾下&#xff1a;比以往的版本里缺少了兩個.ini文件&#xff0c;直接copy過來&#xff0c;進行修改,my.ini&#xff1a;[client]port3306default-character-…

《劍指Offer》62:圓圈中最后剩下的數字(約瑟夫環)

題目 0,1,2…,n-1這n個數字排成一個圓圈&#xff0c;從數字0開始&#xff0c;每次從這圓圈你刪除第m個數字。求出這個圓圈里剩下的最后一個數字。 例如&#xff0c;0、1、2、3、4這5個數字組成一個圓圈&#xff0c;從數字0開始每次刪除第3個數字&#xff0c;則刪除的前4個數字…

mysql數據庫老是被鎖怎么解決_Mysql數據庫全局鎖是如何引起的,如何解決?

2019-01-08 回答樂觀鎖與悲觀鎖不同的是&#xff0c;它是一種邏輯上的鎖&#xff0c;而不需要數據庫提供鎖機制來支持當數據很重要&#xff0c;回滾或重試一次需要很大的開銷時&#xff0c;需要保證操作的acid性質&#xff0c;此時應該采用悲觀鎖而當數據對即時的一致性要求不高…

我們邊吃曲奇邊聊——Cookie與Session那些事

Cookie與Session分別是什么&#xff1f; HTTP Cookie&#xff08;也叫 Web Cookie 或瀏覽器 Cookie&#xff09;是服務器發送到用戶瀏覽器并保存在本地的一小塊數據&#xff0c;它會在瀏覽器下次向同一服務器再發起請求時被攜帶并發送到服務器上。 通常&#xff0c;它用于告知…

mysql 不能添加外鍵 1215_MySQL錯誤1215:無法添加外鍵約束

我正在嘗試將新模式轉發工程到我的數據庫服務器上&#xff0c;但是我不知道為什么會收到此錯誤。我試圖在這里搜索答案&#xff0c;但是我發現的所有內容都說是將db引擎設置為Innodb或確保要用作外鍵的鍵是它們自己表中的主鍵。如果我沒記錯的話&#xff0c;我都做過這兩件事。…

JMH初體驗

什么是JMH JMH是 Java Microbenchmark Harness 的縮寫。中文意思大致是 “JAVA 微基準測試套件”。 基準測試是指通過設計科學的測試方法、測試工具和測試系統&#xff0c;實現對一類測試對象的某項性能指標進行定量的和可對比的測試。——百度百科 為什么要使用 JMH 基準測試…

java map取第一個元素_Java Set接口 Map 與枚舉

Set接口概述一個不包含重復元素的 collection。更確切地講&#xff0c;set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2&#xff0c;并且最多包含一個 null 元素特點Set接口是無序的 Set 是繼承于Collection的接口。它是一個不允許有重復元素的集合。Set可以存儲null值,但是nu…

Python中yield簡單用法

Python中yield簡單用法 你或許知道帶有yield的函數在Python中被稱之為generator&#xff0c;那何為 generator&#xff1f; 我們暫時拋開generator&#xff0c;先從一個常見編程題目開始&#xff0c;循序漸進了解yield的概念。 生成Fibonacci數列 Fibonacci數列是一個經典遞…

js 用下標獲取map值_js map方法處理返回數據,獲取指定數據簡寫方法

map方法處理返回數據&#xff0c;獲取指定數據簡寫方法前言后端返回數據為數組列表時&#xff0c;通常比較全面&#xff0c;包含了很多不需要的數據&#xff0c;可以通過 map 方法處理返回數據&#xff0c;篩選出想要的數據例如// 返回數據res [{id: 1,name: zhangsan,age: 16…

《Python Cookbook 3rd》筆記匯總

文章目錄一、數據結構二、字符串和文本三、數字、日期和時間四、迭代器與生成器五、文件與IO一、數據結構 標題關鍵詞1.1&#xff1a;拆分序列后賦值給多個變量可迭代對象、拆分賦值1.2&#xff1a;拆分任意長可迭代對象后賦值給多個變量可迭代對象、拆分賦值、星號表達式1.3&…

mysql hp ux_hp ux apa 切換

(HP-UX Only) OR - 1 heartbeat network using APA with 2 trunk members (HP-UX Only) OR - 1 heartbeat network with serial line (HP-UX Only) OR......一、 概述 HP 的 APA 軟件提供兩種網卡冗余切換模式,用以實現網絡高可用性...0x000000000000 hp_apa HP-UX 11i v3 Prer…

Python中[:]與[::]的用法

Python中[:]與[::]的用法 概述 [:]與[::]語法是通用序列操作&#xff08;Common Sequence Operations&#xff09;其中的兩個。用[:]或[::]對多數序列類型&#xff08;可變的或不可變的&#xff09;&#xff08;如字符串、列表等&#xff09;序列中元素進行截取。 [:]的用法…

mysql redis 中間件_Docker快速搭建Mysql社區版,Redis,MongoDb、MQ等等中間件。

一&#xff1a;安裝docker社區版。Centos系列(最好用7以上的版本&#xff0c;docker需要3.1以上的linux內核版本)sudo yum install docker-ce docker-ce-cli containerd.iosudo systemctl start dockersudo docker run hello-world如果你敲docker info需要root密碼&#xff0c;…

JavaScript中String的slice(),substr(),substring()三者區別

JavaScript中String的slice()&#xff0c;substr()&#xff0c;substring()三者區別 共同之處 從給定的字符串中截取片段&#xff0c;并返回全新的這片段的字符串對象&#xff0c;且不會改動原字符串。 具體不同之處 slice() str.slice(beginIndex[, endIndex])參數描述be…

pythontuple數據類型_數據類型-元組Tuple

Python Tuple用于存儲不可變python對象的序列。元組類似于列表&#xff0c;因為可以改變列表中存儲的項的值&#xff0c;而元組是不可變的&#xff0c;并且不能改變存儲在元組中的項的值。元組可以寫成用小括號括起來的逗號分隔值的集合。元組可以定義如下。T1 (101, "Ay…

《劍指Offer》24:反轉鏈表

題目 定義一個函數&#xff0c;輸入一個鏈表的頭節點&#xff0c;反轉鏈表并輸出反轉后鏈表的頭節點。鏈表節點定義如下&#xff1a; public static class ListNode{public int val;public ListNode next;public ListNode(int val) {this.val val;} }分析 方法一&#xff1…

python兩個for循環為什么第二個循環里值不變_兩個for循環,第二個只在第一個迭代python上執行...

我是一個pythonnoob&#xff0c;我試圖比較兩個文件中的行之間的值&#xff0c;如果行在第二個文件中&#xff0c;則輸出“line name”&#xff0c;然后輸出1&#xff1b;如果第二個文件中缺少該行&#xff0c;則輸出0。第一次迭代返回1&#xff0c;因為該行在第二個文件中&…

python如何問問題_學會正確的提問

可能很多讀者看到這個標題會感覺很可笑&#xff0c;提問誰不會啊&#xff0c;互聯網時代&#xff0c;提問還不是一句話的事情&#xff1f;個人、技術群、論壇里都可以提問啊&#xff0c;「你好」「在嗎&#xff1f;」「有人用過 xx 工具嗎&#xff1f;」。首先&#xff0c;提問…