java中泛型上限,下限應用

v 一.程序中無形之中用到的泛型
import java.util.*;
class Person implements Comparable<Person>{String name;int age;Person(){name = "";age = 0;}Person(String name, int age){this.name = name;this.age = age;}public String toString(){return name + "...." + age;}public int compareTo(Person o){if(name.compareTo(o.name)==0)return o.age - age;return o.name.compareTo(name);}
}class Student extends Person{int score;public Student(){super();}public Student(String name, int age, int score){super(name, age);this.score = score;}public String toString(){return  name + "...." + age + "...." + "score: " + score;}
}class Worker extends Person{int salary;public Worker(){super();}public Worker(String name, int age, int salary){super(name, age);this.salary = salary;}public String toString(){return  name + "...." + age + "...." + "salary: " + salary;}
}class ComparatorPerson implements Comparator<Person>{public int compare(Person o1, Person o2){if(o1.name.compareTo(o2.name)==0)return o1.age - o2.age;return o1.name.compareTo(o2.name);}
}public class Test{public static void main(String[] args){ArrayList<Person> arr = new ArrayList<Person>();arr.add(new Person("hujunzheng", 22));arr.add(new Person("caihaibin", 21));arr.add(new Person("huangweidong", 22));ArrayList<Student> arr1 = new ArrayList<Student>();arr1.add(new Student("hujunzheng", 22, 500));arr1.add(new Student("caihaibin", 21, 444));arr1.add(new Student("huangweidong", 22, 777));ArrayList<Worker> arr2 = new ArrayList<Worker>();arr2.add(new Worker("789", 22, 500));arr2.add(new Worker("465", 21, 444));arr2.add(new Worker("798", 22, 777));//public boolean addAll(Collection<? extends E> c)// 泛型的上限:用于存儲的數據// 如果不是<? extends E> 而只是<E> 那么E的子類型就不能加載進來!因為Collection<Person> 和 ArrayList<Student>泛型管理的不是同一數據類型// 而 <? extends E> 要求傳進來的對象實例管理的泛型只要是 E 或者是 E的子類都行!
       arr.addAll(arr1);arr.addAll(arr2);Object[] oo = null;Arrays.sort(oo=arr.toArray());for(Object o : oo)System.out.println(o);//public TreeSet(Comparator<? super E> c); 傳遞的是比較泛型為 E 或者是 E的父類的比較器//在進行 E類型兩個數據比較的時候, 用 E類 或者 E類型的父類型進行接收,并使用 ?類型的定義的比較方式!
       System.out.println("泛型上限,下限...................................................");TreeSet<Worker> tw = new TreeSet<Worker>(new ComparatorPerson());// E 是 Worker, 傳遞的是其父類Person的比較器
       tw.addAll(arr2);for(Iterator it = tw.iterator(); it.hasNext(); )System.out.println(it.next());TreeSet<Student> ts= new TreeSet<Student>(new ComparatorPerson());// E 是 Student, 傳遞的是其父類Person的比較器
       ts.addAll(arr1);for(Object o : ts.toArray())System.out.println(o);//上述的Worker 和 Student在TreeSet中排序時使用的比較器都是Person類實現的比較器
   }
}
v 二.簡單的理解

?

ArrayList<Person> alist = new ArrayList<Person>();
ArrayList<? extends Person> list = new ArrayList<Student>();
alist.addAll(list);
Person p = new Person();
Student s = new Student();
//compile error
list.add(p);或者 list.add(s);

一般來講,定義成<? extends T>的參數通常只能用來從里面取數據,而不能用add方法添加數據。

ArrayList<? super Person> list = new ArrayList<Person>();
Student s = new Student(); 
list.add(s);
s = (Student) list.get(0);

而定義成<? super T>的參數是可以用add方法來進行數據的添加的。它接受的 T類型或者T的父類,為什么Student是Person的子類但是仍能接受呢?因為在加入的時候講Sutdent進行了向上轉型為Object,這就是為什么在取出元素的時候是Object類型了!

轉載于:https://www.cnblogs.com/hujunzheng/p/3872633.html

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

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

相關文章

株洲c語言培訓機構,株洲好就業的學c語言程序設計,計算機專業地址

株洲好就業的學c語言程序設計衡陽市瀟湘職業中等專業學校是由衡陽市教育主管&#xff0c;在衡陽校區的基礎上設置的一所綜合性全日制中等職業學校。坐落在國內優秀旅游城市、國內高新技術產業基地、名人輩出的全國歷史文化名城-----衡陽市。我校依托長沙醫校院&#xff0c;實現…

er圖外鍵怎么表示_本周話題:取消考研復試最能實現相對公平?你怎么看?

2020取消研究生復試的呼聲越來越高&#xff1f;考研er們&#xff1a;壓力太大&#xff01;近日&#xff0c;紅網作者李詩元的一篇《取消考研復試最能實現相對公平》引起熱議國家線的出臺和調劑系統5月20日的才開的通知讓大家直接炸開了郭就山西大學來說 往年都是調劑生和一志愿…

java中匿名類的注意細節

abstract class Outer{int num;public Outer(int x){num x;}public abstract void show1();public abstract void show2(); }public class PC{public static void main(String[] args){new Outer(55)//構造父類部分//子類重寫部分{public void show1(){System.out.println(num…

ios沙箱模式開啟_iOS沙盒篇

iOS系統在安全性上的一大亮點就是沙盒。每個iOS應用SDK都被限制在沙盒中&#xff0c;我們可以把沙盒當成一個設置了僅當前SDK可以訪問的文件夾&#xff0c;蘋果對沙盒有以下幾條限制&#xff1a;應用程序可以在自己的沙盒中運行&#xff0c;但不能訪問任何其他應用程序的沙盒。…

c語言不定方程的二元一次,poj1061 - 同余方程,二元一次不定方程

以前不會解二元一次不定方程的時候不會做&#xff0c;現在會做了。#include #include using namespace std;typedef __int64 int64;void solveType1(int64 a, int64 b, int64 & x, int64 & y, int64 & d) {if (b 0) {x 1; y 0; d a;return;}int64 _x, _y, _d;s…

java中異常注意的細節1

/* public class Test{public static void main(String[] args){int i0;try{func();//區別就是該函數拋出的異常被封裝了&#xff0c;外界不知道到底會不會發生該異常System.out.println("i " i);//所以這句話是有機會執行的}catch(Exception e){System.out.printl…

append 后如何刪除_如何在STATA中合并數據文件呢?

?作者&#xff1a;江小白郵箱&#xff1a;jieresearch163.com?我們在使用stata進行數據分析時&#xff0c;可能涉及多個數據文檔的合并操作或者同時使用不同數據集中的多個變量&#xff0c;這都需要我們進行文檔間不同變量的歸并。例如&#xff0c;我們需要使用CFPS(中國家庭…

linux 內網怎么安裝git環境_linux 安裝go環境

官網下載安裝包The Go Programming Language?golang.google.cngo1.4.linux-amd64.tar.gz解壓&#xff1a;tar -C /usr/local -zxvf go1.4.linux-amd64.tar.gz添加環境變量&#xff1a;export PATH$PATH:/usr/local/go/bin安裝完成輸入go測試安裝成功&#xff0c;寫個簡單的代碼…

java中異常注意問題(發生在多態是的異常問題)

/* 異常的注意事項&#xff1a; 1&#xff0c;子類在覆蓋父類方法時&#xff0c;父類的方法如果拋出了異常&#xff0c;那么子類的方法只能拋出父類的異常或者該異常的子類。 2&#xff0c;如果父類拋出多個異常&#xff0c;那么子類只能拋出父類異常的子集。 簡單說&#xff1…

cups支持的打印機列表_Win10“Microsoft Print to PDF”虛擬打印機不見了,如何找回?...

MS酋長很早以前在介紹Windows10的新功能時&#xff0c;就提到過《Win10原生支持把文件轉換成PDF格式》&#xff0c;該功能實際上是基于“Microsoft Print to PDF”虛擬打印機來實現的。當你點擊打印時&#xff0c;在打印機列表中就可以看到“Microsoft Print to PDF”虛擬打印機…

循環隊列的進隊算法c語言,循環隊列的定義,入隊算法,出隊算法,遍歷算法,及其代碼實現-Go語言中文社區...

隊列 的定義&#xff1a;一種可以是實現“先進先出”的存儲結構。數據的進出類似于排隊購票。隊只允許隊尾一端(rear)添加&#xff0c;在另一端隊頭(front)刪除。隊有隊頭(front)和隊尾(rear)兩個指針。隊頭front指向第一個元素&#xff0c;隊尾rear指向無實際意義的元素&#…

java中paint方法和paintComponent方法的不同

/*1.由Component.java源代碼中可以看見其中的paint&#xff08;&#xff09;方法體是空的&#xff0c;在Container中重寫了該方法&#xff0c;其子類Window等也重寫了該方法2.由JComponent.java源代碼中可以看見其中的paint()方法中調用paintComponent, paintChildren, paintBo…

java office文件加水印_文檔預覽加水印——或可一用的防泄密方式

給文件加水印是常見的一種宣示版權的方式。像Office、WPS都自帶加水印功能&#xff0c;能夠給文檔加上"保密"、"嚴禁復制"這樣的水印。在多可系統中&#xff0c;也有這么一個添加水印的功能。啟用該功能后&#xff0c;在使用HTML5預覽時&#xff0c;多可系…

android 獲取apk資源,android-apk-parser

APK解析庫用于讀取/解析 packageName。versionName。versionCode信息的簡單類&#xff0c;以及已經編譯的androidsdk文件中的更多內容。通過解壓 AndroidManifest.xml 文件并解碼編譯好的XML二進制文件來收集這里信息&#xff0c;就可以實現。我一直在用它來實現各種android工件…

apache license 2.0如何使用防止法律糾紛_go語言使用Swaggo詳細教程

相信很多程序猿和我一樣不喜歡寫API文檔。寫代碼多舒服&#xff0c;寫文檔不僅要花費大量的時間&#xff0c;有時候還不能做到面面具全。但API文檔是必不可少的&#xff0c;相信其重要性就不用我說了&#xff0c;一份含糊的文檔甚至能讓前后端人員打起來。 而今天這篇博客介紹的…

靜態代碼塊,構造代碼塊,局部代碼塊演示

public class Test{static int num;static int numObj;//記錄有多少個對象產生&#xff01;static{//靜態代碼塊&#xff0c; 是用來給類進行初始化的&#xff01;//num 10;num;num *12;//沒有進入靜態代碼塊之前&#xff0c;num的初始化值是0System.out.println(num);//main(…

android執行main函數,AndroidStudio執行main方法報錯

問題&#xff1a;有時在開發中想直接寫一個java文件來測試一些東西&#xff0c;但是AndroidStudio執行的時候會報錯。代碼信息&#xff1a;public class HelloWorld {public static void main(String[] args) {System.out.println("HelloWorld");}}報錯信息12:04:41:…

模擬java.util.Collection一些簡單的用法

/* 需求&#xff1a;模擬java.util.Collection一些簡單的用法&#xff01;注意&#xff1a;java虛擬機中并沒有泛型類型的對象。泛型是通過編譯器執行一個被稱為類型擦除的前段轉換來實現的。 1&#xff09;用泛型的原生類型替代泛型。 原生類型是泛型中去掉尖括號及其中的類型…

hive 導出json格式 文件_Hive 系列 之 基本操作合集

下面是本課程概覽&#xff1a;&#xff08;1&#xff09;hive系列之簡介&#xff0c;安裝&#xff0c;beeline和hiveserver2&#xff08;2&#xff09;hive系列之基本操作&#xff08;3&#xff09;hive系列之udf&#xff08;4&#xff09;hive系列之二級分區和動態分區&#x…

android開發自定義view倍絲曲線,從0到1Android自定義View(四)貝塞爾曲線

原標題&#xff1a;從0到1Android自定義View(四)貝塞爾曲線2017年安卓巴士全球開發者論壇-上海站作者本文由兩點水投稿&#xff0c;博客地址&#xff1a;http://www.apkbus.com/myspaceblog-911082.html前言扯來扯去&#xff0c;前面三篇自定義 View 文章&#xff0c;終于扯完了…