日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java泛型程序设计——无限定通配符+通配符捕获

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java泛型程序设计——无限定通配符+通配符捕获 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【0】README

0.1) 本文描述+源代碼均 轉自 core java volume 1, 旨在理解 java泛型程序設計 的 無限定通配符+通配符捕獲 的相關知識;


【1】無限定通配符相關

1.1)無限定通配符: 如Pair< ?>;

  • 1.1.1)類型 Pair< ?> 有方法如下所示:
? getFirst() : 返回值只能賦給 Object,; void setFirst(?) : setFirst 方法不能被調用, 甚至不能用 Object 調用;
  • 1.1.2)Pair< ?> 和 Pair 本質不同在于: 可以用任意 Object對象調用原始的 Pair類的setObject 方法; (也可以調用 setFirst(null));

1.2)為什么要使用 無限定通配符?

  • 1.2.1)看個荔枝:下面方法將用來測試一個 pair 是否包含一個 null 引用, 它不需要實際的類型;
public static boolean hasNulls(Pair<?> p) {return p.getFirst() == null || p.getSecond() == null; }
  • 1.2.2)通過將 hasNulls 轉換成泛型方法, 可以避免使用 通配符類型:
public static <T> boolean hasNulls(Pair<T> p) , 但是帶有通配符的版本可讀性更強了;

【2】通配符捕獲相關

2.1)出現的問題:

  • 2.1.1)通配符不是類型變量, 不能在編寫代碼中使用 ? 作為一種類型, 下面代碼是非法的:
? t = p.getFirst(); // ERROR p.setFirst(p.getSecond()); p.setSecond(t);

2.2)解決方法: 編寫一個輔助方法 swapHelper, 如下所示:

public static <T> void swapHelper(Pair<T> p) {T t = p.getFirst();p.setFirst(p.getSecond());p.setSecond(t); }
  • Attention) swapHelper 是一個 泛型方法, 而 swap不是, 它具有固定的Pair

public static void swap(Pair<?> p) { swapHelper(p); }

2.4)當然, 在這種情況下, 并不是一定要使用通配符。

  • 2.4.1)我們已經直接實現了 沒有 通配符的泛型方法 void swap(Pair p) , 看個荔枝:
public static void maxminBonus(Manager[] a, Pair<? super Manager> result) {minmaxBonus(a, result);PairAlg.swap(result) ; //OK--swapHelper captures wildcard type }
  • 在這里,通配符捕獲機制是不可避免的;
  • 2.4.2)通配符捕獲只有在很多限制的情況下才是合法的。
  • 編譯器必須能夠確信通配符表達的是 單個、確定的類型;如, ArrayList< Pair< T>> 中的T 永遠不能捕獲 ArrayList< Pair< ?>> 中的通配符;


總結

以上是生活随笔為你收集整理的java泛型程序设计——无限定通配符+通配符捕获的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。