摘要:表示類的允許范圍是及其子類表示類的允許范圍是及其父類。存值只要能保證存放類是指定類及其子類即可。取值取得的默認類型為上界,的默認類型為所有類的父類。
概覽
集合框架的源碼經(jīng)常見到“? extends E”、“? super T”。本篇文章以實例+注釋講講“有限通配符的參數(shù)化類型”的創(chuàng)建、存值以及取值。
這兩種都是限定類的取值范圍的寫法。“? extends T”表示類的允許范圍是T及其子類;“? super T”表示類的允許范圍是T及其父類。也就是new的時候受到此約束。
存值:只要能保證存放類是指定類及其子類即可。null不受“? extends/super T”約束。
取值:“? extends T”取得的默認類型為上界T,“? super T”的默認類型為所有類的父類Object。
Demopackage generic; import java.util.PriorityQueue; public class Extend { public static void main(String[] args) { // ? extends T,T為臨界類 // extends限定了類的上界 // Type mismatch: cannot convert from PriorityQueueto PriorityQueue extends Parent> //PriorityQueue extends Parent> pq = new PriorityQueue (); PriorityQueue extends Parent> pq = new PriorityQueue (); // 無法直接放入,因為無法保證存放類與Son的關(guān)系 //The method add(capture#1-of ? extends Parent) in the type PriorityQueue is not applicable for the arguments (Son) //pq.add(new Son())); //The method add(capture#1-of ? extends Parent) in the type PriorityQueue is not applicable for the arguments (Son) //pq.add(new Parent()); //null不受類型限定,但PriorityQueue不允許為空,會拋出空指針異常 //pq.add(null); // 間接存放 PriorityQueue pqs = new PriorityQueue (); pqs.add(new Son("1")); pqs.add(new Son("2")); pqs.add(new Son("3")); pqs.add(new Son("4")); PriorityQueue extends Parent> pq1 = pqs; //取值 Son s = (Son) pq1.poll(); Parent p = pq1.poll(); //Daughter d = (Daughter) pq1.poll(); // 編譯通過,執(zhí)行報錯。類型轉(zhuǎn)換異常。 Person pp= pq1.poll(); System.out.println(s.getName()); System.out.println(p.getName()); System.out.println(pp.getName()); } }
package generic; import java.util.PriorityQueue; public class Super { public static void main(String[] args) { // ? super T,T為臨界類 // super限制了下界 // Type mismatch: cannot convert from PriorityQueueto PriorityQueue super Parent> //PriorityQueue super Parent> pq = new PriorityQueue (); PriorityQueue super Parent> pq = new PriorityQueue (); // 可存放臨界類的子類,因為任一“? super T”也是其父類 pq.add(new Son("1")); pq.add(new Daughter("2")); pq.add(new Parent("3")); // The method add(capture#4-of ? super Parent) in the type PriorityQueue is not applicable for the arguments (Person) //pq.add(new Person("4")); // 取值(默認Object,類型順序必須與存放對應或者是其父類,否則類型轉(zhuǎn)換錯誤) /*Parent p = (Parent) pq.poll(); Daughter d = (Daughter) pq.poll(); Son s = (Son) pq.poll();*/ Parent p = (Parent) pq.poll(); Parent d = (Parent) pq.poll(); Parent s = (Parent) pq.poll(); System.out.println(d.getName()); System.out.println(p.getName()); System.out.println(s.getName()); } }
package generic; public class Person implements Comparable{ protected String name; public Person(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int compareTo(Person o) { return o.name.compareTo(this.name); } }
package generic; public class Parent extends Person{ private String name; public Parent(String name) { super(name); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package generic; public class Son extends Parent{ private String name; public Son(String name) { super(name); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package generic; public class Daughter extends Parent{ private String name; public Daughter(String name) { super(name); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }說點什么
針對以上特性,java中有“PECS(“Producer Extends,Consumer Super”)”的說法。即如果要用參數(shù)化類型表示生產(chǎn)者,就使用 extends T>;如果表示消費者,就使用 super T>。
更多有意思的內(nèi)容,歡迎訪問筆者小站: rebey.cn
推薦閱讀Java 泛型: 什么是PECS(Producer Extends, Consumer Super)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70173.html
摘要:簡述大家在平時的工作學習中肯定會見過不少如下的語句我們都知道上面的代碼時關(guān)于泛型的那么這兩個不同的寫法都有什么區(qū)別呢首先說到的泛型我們必須要提到的是泛型的類型擦除機制中的泛型基本上都是在編譯器這個層次來實現(xiàn)的在生成的字節(jié)代碼中是不包含泛型中 簡述 大家在平時的工作學習中, 肯定會見過不少如下的語句: List 就表示了泛型參數(shù)是某個類型, 只不過我們并不知道它的具體類型時什么.List...
摘要:新建一個類該函數(shù)返回一個類的實例給函數(shù)傳入通過立即調(diào)用類構(gòu)造函數(shù)可以創(chuàng)建單例。派生類是指繼承自其它類的新類。在構(gòu)造函數(shù)中訪問之前要調(diào)用,負責初始化。在構(gòu)造函數(shù)中使用通常表示當前的構(gòu)造函數(shù)名。 ES5中的近類結(jié)構(gòu) ES5以及之前的版本,沒有類的概念,但是聰明的JavaScript開發(fā)者,為了實現(xiàn)面向?qū)ο螅瑒?chuàng)建了特殊的近類結(jié)構(gòu)。 ES5中創(chuàng)建類的方法:新建一個構(gòu)造函數(shù),定義一個方法并且賦值...
摘要:新建一個類該函數(shù)返回一個類的實例給函數(shù)傳入通過立即調(diào)用類構(gòu)造函數(shù)可以創(chuàng)建單例。派生類是指繼承自其它類的新類。在構(gòu)造函數(shù)中訪問之前要調(diào)用,負責初始化。在構(gòu)造函數(shù)中使用通常表示當前的構(gòu)造函數(shù)名。 ES5中的近類結(jié)構(gòu) ES5以及之前的版本,沒有類的概念,但是聰明的JavaScript開發(fā)者,為了實現(xiàn)面向?qū)ο螅瑒?chuàng)建了特殊的近類結(jié)構(gòu)。 ES5中創(chuàng)建類的方法:新建一個構(gòu)造函數(shù),定義一個方法并且賦值...
摘要:在上篇文章中我們的模板引擎實現(xiàn)了對和對支持,同時在文章的最后我給大家留了一個問題如何實現(xiàn)支持和的標簽功能。在本篇文章中我們將一起來動手實現(xiàn)這兩個功能。 在 上篇文章 中我們的模板引擎實現(xiàn)了對 if 和 for 對支持,同時在文章的最后我給大家留了一個 問題:如何實現(xiàn)支持 include 和 extends 的標簽功能。 在本篇文章中我們將一起來動手實現(xiàn)這兩個功能。 include in...
閱讀 3064·2021-10-12 10:20
閱讀 2809·2021-09-27 13:56
閱讀 790·2021-09-27 13:36
閱讀 1424·2021-09-26 09:46
閱讀 2417·2019-08-30 14:02
閱讀 2685·2019-08-28 18:14
閱讀 1257·2019-08-26 10:32
閱讀 1700·2019-08-23 18:25