JAVA泛型之<? extends T>:(通配符上限)和<? super T>(通配符下限)

来源:http://www.cnblogs.com/HouJiao/archive/2016/02/05/5183536.html
-Advertisement-
Play Games

一.通配符上限和通配符下限接受的類型 通配符上限:<? extends T> 通配符下限:<? super T> 以下代碼是測試結果,註釋為解釋說明 1 package xayd.hjj; 2 3 import java.util.ArrayList; 4 import java.util.List


  一.通配符上限和通配符下限接受的類型

  通配符上限:<? extends T>

  通配符下限:<? super T>

  以下代碼是測試結果,註釋為解釋說明

 1 package xayd.hjj;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 class A{}
 7 class B extends A implements F{}
 8 class C extends A{}
 9 class D extends A{}
10 class E{}
11 interface F{}
12 
13 public class Test{
14     
15     public static void main(String[] args) {        
16         
17         //下麵五行代碼說明:List<? extends A>接受A或者繼承A的類
18         List<? extends A> listA = new ArrayList<A>();
19         List<? extends A> listB = new ArrayList<B>();
20         List<? extends A> listC = new ArrayList<C>();
21         List<? extends A> listD = new ArrayList<D>();
22         // List<? extends A> listE = new ArrayList<E>();  //編譯不能通過,類E與類A無關
23         
24         
25         //下麵三行代碼說明:List<? super B>接受B或者的父類
26         List<? super B> listA1 = new ArrayList<A>();
       List<? super B> listA2 = new ArrayList<B>();
27 List<? super B> listF = new ArrayList<F>(); 28 //List<? super B> listC1 = new ArrayList<C>(); //編譯不能通過,類C不是類B的父類 29 30 } 31 }

 

   二.通配符下限和通配符上限存取問題

   通配符上限:<? extends A>

   List<? extends A> list = new ArrayList<B>();

   這樣定義一個list的時候,是不允許向這個list添加任何東西的。list可以接受其B類型和B的子類。像list中添加對象的時候因為編譯器不能確定這個子類的確切類型,因此不允許向里添加任何對象。唯一可以添加的是null。也可以這樣理解:Fruit是Apple的父類,也是orange的父類。但是你不能說Fruit就是Apple或者orange。

   代碼測試如下:

 1 package xayd.hjj;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 class A{}
 6 class B extends A implements F{}
 7 class C extends A{}
 8 class D extends A{}
 9 class E{}
10 interface F{}
11 public class Test{
12     public void a(List<? extends A> list){
13         list.add(null);        //編譯通過,但無實際意義
14         // list.add(new B());  //編譯不能通過
15         // list.add(new A());  //編譯不能通過
16         
17     }
18 
19     public static void main(String[] args) {        
20         Test test = new Test();
21         List<? extends A> listB = new ArrayList<B>();
22         test.a(listB);
23         
24     }
25 }

 

  

  通配符下限:<? super B>

  List<? super B> list = new ArrayList<A>();

  這樣定義一個list的時候,允許向這個list添加對象。list可以接受其B類型和B的父類。像list中添加對象的時候編譯器能確定確切類型。也可以這樣理解:Fruit是Apple的父類,也是orange的父類。我們可以說Apple就是一個Fruit。

   代碼測試如下:

 1 package xayd.hjj;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 class A{}
 6 class B extends A implements F{}
 7 class C extends A{}
 8 class D extends A{}
 9 class E{}
10 interface F{}
11 public class Test{
12     
13     public void b(List<? super B> list){
14         
15         
16         list.add(new B());     ////編譯通過
17         //list.add(new A());   //編譯不能通過,要使用類型轉換
18         list.add((B) new A()); ////編譯通過      
19         
20     }  
21     public static void main(String[] args) {                
22         List<? super B> listA = new ArrayList<A>();
23         test.b(listA);
24         
25         
26     
27         
28     }
29 }

 


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

-Advertisement-
Play Games
更多相關文章
  • 集合概述 集合簡單的說就是數組的升級版。他可以動態的對集合的長度(也就是集合內最大元素的個數)進行定義和維護! ArrayList ArrayList非常類似於數組。也有人稱他為數組列表,它的容量可以根據需要進行動態擴充,而它的索引也會根據集合容量的擴展而重新分配和調整。也就是說ArrayList集...
  • ASP.NET使用StructureMap等依賴註入組件時最重要就是EntityFramework的DbContext對象要保證在每次HttpRequest只有一個DbContext實例,這裡將使用第三方提供的HttpSimulator進行測試。 1.定義IDependency介面 創建屏蔽不同依賴
  • 由快速排序引發對Java方法參數的思考
  • 一、三元運算 我們在上章學習的if,,else,,有一種簡便的方法 他的表達式是這樣的:變數 = 值1 if 條件 else 值2 解釋過來就是如果aaa等於sss則輸出值1否則輸出值2 二、類的概念 類是面向對象編程的核心, 它扮演相關數據及邏輯的容器角色。它們提供了創建“真實” 對象(也就是實例
  • 練習: 輸入詩的名稱查詢出詩的內容,當輸入exit時,退出程式,“春曉”,“靜夜思”,“鵝”。 package CollectionPart; public class Poetry { private String title; private String poet; private Strin
  • 說明:垃圾回收演算法是理論,垃圾收集器是回收演算法的實現,關於回收演算法,見《第四章 JVM垃圾回收演算法》 1、七種垃圾收集器 Serial(串列GC) ParNew(並行GC) Parallel Scavenge(並行回收GC) Serial Old(MSC)(串列GC) CMS(併發GC) Paral
  • 今天分享一個 企業級的通用鏈表庫設計和一個簡單字元串設計. 封裝一個簡單的開發框架還是比較麻煩的, 或者說說封裝一個簡單的基庫都挺麻煩的. 全當分享吧. 簡單扯一點,封裝庫其實難點在 前期是設計,中期是演算法,瓶頸在結構和語法解析上.
  • Java Magic. Part 1: java.net.URL @(Base)[JDK, url, magic, 黑魔法] " 英文原文 " 廢話不多說,首先我們看如下代碼: 代碼的第3行和第5行分別會輸出什麼呢? 當然不會是true, 如果是true的話,這篇文章也就不會有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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...