亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

通過代碼理解java泛型

2024-07-14 08:42:01
字體:
來源:轉載
供稿:網友

泛型數據java基礎,但真正理解需要悉心品嘗。畢竟在工作中用到的是在是太多了。

不要以為new ArrayList<>這就是泛型,這只能屬于會使用。

在工作中,相對于現有的項目源碼的數據庫操作層,無論是mybatis,hibernate或者是自己封裝的baseModel層,都會使用到泛型。

以及<? extends T> 和 <? super T>這個屌東西。

泛型使用情況分為三類

1. 泛型類。

2. 泛型方法。

3. 泛型接口。

出于規范的目的,Java 還是建議我們用單個大寫字母來代表類型參數。常見的如:

1. T 代表一般的任何類。

2. E 代表 Element 的意思,或者 Exception 異常的意思。

3. K 代表 Key 的意思。

4. V 代表 Value 的意思,通常與 K 一起配合使用。

5. S 代表 Subtype 的意思,文章后面部分會講解示意。

最直接的一段代碼。

List<String> l1 = new ArrayList<String>();  List<Integer> l2 = new ArrayList<Integer>();  System.out.println(l1.getClass() == l2.getClass());

打印的判斷為TRUE,因為泛型信息被擦除了。

泛型擦除實例。

List<String> listErasure = new ArrayList<String>() {   // 直接初始化,這也是一種方式。直接傳入一個collection。   {add("aaa");add("bbb");}  };  listErasure.add("ccc");  Class<? extends List> class1 = listErasure.getClass();  Method method = class1.getMethod("add",Object.class);  method.invoke(listErasure, 123);  System.out.println(listErasure)

輸出結果  [aaa, bbb, ccc, 123]

明明是接收String類型,但是卻可以通過反射對其進行Integer類型的操作。

可見泛型只是在編譯期間有效。

 

<?> 代表著類型未知

<? extends T> 和 <? super T>這個東西經常見到,但是并沒有字面意義那么簡單。

通配符有 3 種形式。

  1. <?> 被稱作無限定的通配符。
  2. <? extends T> 被稱作有上限的通配符。
  3. <? super T> 被稱作有下限的通配符。
class A{}class B extends A{}class C extends B{}
List<? extends B> listExtends = new ArrayList<B>();//  listExtends.add(new A()); 全部編譯錯誤。因為使用的是extends,喪失了寫的操作能力。跟f3方法一樣,是未知類型,只是確定了里面對象的范圍。是B的子類。//  listExtends.add(new B());//  listExtends.add(new C());    // 能進行對B以及B的子類操作。這是super的神奇之處。  List<? super B> listSuper = new ArrayList<B>();//  listSuper.add(new A());//會編譯錯誤。  listSuper.add(new B());  listSuper.add(new C());

以及方法泛型的返回

泛型作為參數的傳遞。

public static <TTT>TTT f1(TTT t) {  return t; }  // 傳遞指定的A類型,對應的list可以進行對應的list應有的方法。 public static void f2(List<A> list) {  list.add(new A());  System.out.println(list.size()); }  public static void f3(List<?> list) {//  list.add(new A()); //當傳入的是?通配符的話表示只能進行跟?無關的操作,類似于size方法,增加代碼的可讀性。  System.out.println(list.size()); }  public static void f4(List<? extends B> listExtends) {//  listExtends.add(new B());//不能進行寫做操,因為是?,增加了可讀性。  System.out.println(listExtends.size()); }

測試代碼,很全面

package com.javaSE.fanxing;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;class A{}class B extends A{}class C extends B{}public class Demo<T,TT> { T value;  TT value2; public TT getValue2() {  return value2; } public void setValue2(TT value2) {  this.value2 = value2; } public T getValue() {  return value; } public void setValue(T value) {  this.value = value; } public static <TTT>TTT f1(TTT t) {  return t; } // 傳遞指定的A類型,對應的list可以進行對應的list應有的方法。 public static void f2(List<A> list) {  list.add(new A());  System.out.println(list.size()); } public static void f3(List<?> list) {//  list.add(new A()); //當傳入的是?通配符的話表示只能進行跟?無關的操作,類似于size方法,增加代碼的可讀性。  System.out.println(list.size()); } public static void f4(List<? extends B> listExtends) {//  listExtends.add(new B());//不能進行寫做操,因為是?,增加了可讀性。  System.out.println(listExtends.size()); } public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {  // 打印的判斷為TRUE,因為泛型信息被擦除了。  List<String> l1 = new ArrayList<String>();  List<Integer> l2 = new ArrayList<Integer>();  System.out.println(l1.getClass() == l2.getClass());  // 泛型擦除實例。  List<String> listErasure = new ArrayList<String>() {   // 直接初始化,這也是一種方式。直接傳入一個collection。   {add("aaa");add("bbb");}  };  listErasure.add("ccc");  Class<? extends List> class1 = listErasure.getClass();  Method method = class1.getMethod("add",Object.class);  method.invoke(listErasure, 123);  System.out.println(listErasure);  Demo<String,Integer> demo = new Demo<String,Integer>();  demo.setValue("string");  System.out.println(demo.getValue());      Demo<Integer,String> demo2 = new Demo<Integer,String>();  demo2.setValue(100);  System.out.println(demo2.getValue());      System.out.println(f1(123));//  List<A> listA = new ArrayList<A>();//  List<B> listB = listA;//new ArrayList<B>();雖然B是A的子類,并不代表泛型之間也具備繼承關系。      ArrayList<A> listA = new ArrayList<A>();  listA.add(new A());  f3(listA); // 不對f3方法進行任何操作,是1.  f2(listA); // 2對應的方法實現還進行了一次插入操作。  f3(listA); // static ,對應的listA的集合數量是引用值。      ArrayList<B> listB = new ArrayList<B>();  listB.add(new B());   f3(listB); // f3方法傳遞的是通配符?,不能進行add操作。       // <? extends T> 和 <? super T>  List<? extends B> listExtends = new ArrayList<B>();//  listExtends.add(new A()); 全部編譯錯誤。因為使用的是extends,喪失了寫的操作能力。跟f3方法一樣,是未知類型,只是確定了里面對象的范圍。是B的子類。//  listExtends.add(new B());//  listExtends.add(new C());    // 能進行對B以及B的子類操作。這是super的神奇之處。  List<? super B> listSuper = new ArrayList<B>();//  listSuper.add(new A());//會編譯錯誤。  listSuper.add(new B());  listSuper.add(new C());      // 沒毛病。  List<B> listBS = new ArrayList<B>();   listBS.add(new B());  f4(listBS);  }}


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲天天在线日亚洲洲精| 国产精品高清免费在线观看| 91精品国产高清久久久久久| 久久九九热免费视频| 国产精品xxxxx| 久久精品小视频| 最近免费中文字幕视频2019| 国产乱肥老妇国产一区二| 国产丝袜精品视频| 日产精品99久久久久久| 国产不卡一区二区在线播放| 欧美成人免费va影院高清| 久久影院中文字幕| 国产精品伦子伦免费视频| 亚洲bt天天射| 国产精品视频导航| 欧美亚洲日本黄色| 91成人福利在线| 亚洲伊人第一页| 亚洲精品白浆高清久久久久久| 色婷婷久久一区二区| 日韩一中文字幕| 欧美性高潮床叫视频| 中文字幕9999| 欧美日韩激情视频| 日韩一区二区三区在线播放| 久久精品中文字幕| 亚洲精品久久久久中文字幕二区| 青青精品视频播放| 日韩精品视频免费专区在线播放| 亚洲天堂av在线免费| 午夜免费日韩视频| 国产精品久久久久久久久久久久久久| 国产视频亚洲视频| 中文字幕亚洲二区| 一本一本久久a久久精品牛牛影视| 91久久久久久久一区二区| 国产精品一区二区久久久| 日韩精品免费综合视频在线播放| 92看片淫黄大片看国产片| 亚洲人成网站999久久久综合| 国产精品自产拍高潮在线观看| 色99之美女主播在线视频| 色777狠狠综合秋免鲁丝| 日本成人在线视频网址| 成人a在线观看| 日韩精品在线免费观看| 久久久久久噜噜噜久久久精品| 日韩精品视频中文在线观看| 欧美国产一区二区三区| 最近2019年好看中文字幕视频| 81精品国产乱码久久久久久| 一区二区三区久久精品| 久久久精品国产一区二区| 91亚洲国产精品| 久久视频在线观看免费| 亚洲视频免费一区| 亚洲精品国产福利| xxav国产精品美女主播| 国产精品精品视频| 在线国产精品播放| 日韩免费在线看| 2018中文字幕一区二区三区| 91精品久久久久久久久青青| 国产欧美日韩精品在线观看| 亚洲国产天堂久久国产91| 色无极亚洲影院| 97在线精品国自产拍中文| 在线观看免费高清视频97| 日韩免费看的电影电视剧大全| 久久精品人人做人人爽| 国产精品视频专区| 久久久久久久久久久成人| 一个色综合导航| 欧美午夜视频在线观看| 亚洲欧美制服第一页| 亚洲少妇中文在线| 中文字幕日韩欧美在线视频| 亚洲电影免费观看高清| 91chinesevideo永久地址| 精品动漫一区二区三区| 午夜精品久久久久久久99热| 久久久噜噜噜久久中文字免| 国产精品夫妻激情| 91九色国产在线| 欧美国产视频一区二区| 亚洲国产精彩中文乱码av在线播放| 国产在线高清精品| 亚洲精品少妇网址| 久久久久久国产免费| 日本亚洲欧美三级| 隔壁老王国产在线精品| 亚洲国产精品va| 最近免费中文字幕视频2019| 国产精品青青在线观看爽香蕉| 九色成人免费视频| 色综合久久中文字幕综合网小说| 久热99视频在线观看| 精品国模在线视频| 久久久中精品2020中文| 蜜月aⅴ免费一区二区三区| 国模精品一区二区三区色天香| 日韩视频亚洲视频| 欧美激情综合亚洲一二区| 高清日韩电视剧大全免费播放在线观看| 亚洲欧美在线一区| 色综合91久久精品中文字幕| 国产精品久久久久久久7电影| 国产精品视频久久久久| 欧美限制级电影在线观看| 热99精品只有里视频精品| 日产日韩在线亚洲欧美| 精品久久久久久久久久久| 欧美激情性做爰免费视频| 日本精品免费一区二区三区| 国产精品激情av在线播放| 亚洲精品永久免费精品| 亚洲一区二区三区成人在线视频精品| 久久的精品视频| 91夜夜揉人人捏人人添红杏| 91麻豆国产精品| 欧美性感美女h网站在线观看免费| 久久久精品999| www.xxxx欧美| 日韩亚洲一区二区| 亚洲一级免费视频| 亚洲精品v天堂中文字幕| 日韩av高清不卡| 97视频在线播放| 欧美精品中文字幕一区| 精品免费在线观看| 亚洲国模精品私拍| 97在线视频观看| 午夜精品蜜臀一区二区三区免费| 亚洲欧美精品在线| 亚洲人成五月天| 欧美老女人bb| 亚洲国模精品私拍| www.欧美精品一二三区| 97在线观看视频| 久久久久亚洲精品国产| 狠狠躁夜夜躁人人爽天天天天97| 国产成人精品优优av| 国产偷国产偷亚洲清高网站| 国产精自产拍久久久久久| 欧美国产日韩二区| 欧美一级视频免费在线观看| 成人疯狂猛交xxx| 国产日韩欧美黄色| 一本色道久久88综合亚洲精品ⅰ| 日韩av片永久免费网站| 久久久国产精品x99av| 日本一区二区三区四区视频| 亚洲精品国产综合久久| 欧美日韩国产精品一区| 欧美尺度大的性做爰视频| 97在线视频免费播放| 午夜美女久久久久爽久久| 精品久久久久久中文字幕| 一区二区成人av| 精品视频在线播放| 少妇久久久久久| 成人美女av在线直播| 国产成人在线精品|