麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黄片毛片一级 | 日韩三区视频 | 国产1区2区在线观看 | 欧美xxxwww| 中文字幕www | 免费在线观看国产精品 | 久久精品首页 | 在线影院av | 一本一道久久久a久久久精品91 | 91精品国 | 欧美一级美片在线观看免费 | 日韩精品免费一区二区三区 | 日本残忍极度灌浣肠视频 | 久久精品国产精品亚洲 | 欧美jizzhd极品欧美 | 毛片免费观看视频 | 精品久久久久久久久久久久包黑料 | 免费观看一级黄色片 | caoporn国产一区二区 | 久久精品视频一区二区三区 | 国产亚洲小视频 | 91精品国产乱码久 | 日美黄色片 | 国内精品久久久久久久星辰影视 | 在线观看中文字幕国产 | 黄片毛片一级 | 91精品国产乱码久久久久久久久 | 欧美性生活视频免费 | 99精美视频 | 国产午夜精品一区二区三区嫩草 | 性片免费看 | 欧洲精品色| av久草 | 97久色| 国产免费一区二区三区视频 | 福利在线国产 | 精品一区二区久久久久久久网精 | 黄色成人小视频 | 亚洲国产精品久久久久制服红楼梦 | 摸逼逼视频 | 亚洲免费视频一区 |