91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java泛型容器Collection如何用

發布時間:2023-04-20 09:45:45 來源:億速云 閱讀:137 作者:iii 欄目:編程語言

本篇內容介紹了“java泛型容器Collection如何用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

先簡單來段例子:

public void testGenerics() {
   Collection<Number> numbers = new ArrayList<>();
   numbers.add(1); // ok
   numbers.add(0.1); // ok

   Collection<? extends Number> numbers2 = new ArrayList<>();
   // don't work, you don't know which subtype 'numbers2' exactly contains
   numbers2.add(1); // oops!
}

這個例子其實有點反人類,估計大部分人(包括我)對這種轉換的第一反應肯定是“當然是對的”(這就掉坑了),說下我的理解:

  • Collection<Number>:表示這個Collection里包含的都是Number類型的對象,可以是Integer/Long/Float,因為編譯器可以判斷obj instanceof Number == true;

  • Collection<? extends Number>:表示這個Collection是Number類型的“某個子類型”的Collection實例,可以是Collection<Integer>/Collection<Long>,所以調用numbers2.add(1)是不行的,因為編譯器不知道這個numbers2包含的元素到底是Number的哪個子類型,編譯器無法判斷obj instanceof UnknownType的結果;

  • Collection<E>,這個E類型是“一個”具體的類型,而不能是表示某個parent的多種子類型的占位符;

再來個例子:

public void testGenerics() {
   Collection<Number> numbers = new ArrayList<>();
   Collection<Integer> integers = new ArrayList<>();
   Collection<? extends Number> numbers2 = new ArrayList<>();
   
   numbers2 = integers; // ok
   numbers2 = numbers; // ok
   
   // don't work, Collection<Number> != Collection<Integer>
   numbers = integers; // oops!
}

Integer明明繼承了Number,那為什么

  • Collection<Number> == Collection<Integer>

不成立呢,我們再來看個例子:

public void testGenerics() {
   Collection<Integer> profits = new ArrayList<>();
   
   insertSomething(profits); // line 1
   
   Integer profit = profits.iterator().next(); // oops! crash
}

private void insertSomething(Collection<Number> numbers) {
   numbers.add(Long.MAX_VALUE);
}

如果line 1成立,那么接下去獲取利潤將會得到個負數,后續的一系列計算都會發聲異常,如果代碼不夠健壯甚至可能會拋出一些意料之外的RuntimeException,導致方法不正常結束甚至程序crash。

所以一句話,Collection<Number> != Collection<Integer>是為了運行期的安全,將可能發生的類型轉換異常在編譯期就解決掉。

現在再來說說Collection<Object>與Collection<?>,又是很多人(包括我)第一反應肯定是“Object是所有java對象的公共父類,所以Collection<Object>可以表示任意類型的集合”,來看個例子:

public void testGenerics2() {
   Collection<Integer> integers = new ArrayList<>();

   Collection<?> objects2 = integers; // ok
   // don't work, which type of 'objects2' contains is uncertain
   objects2.add(1); // oops!
   
   Collection<Object> objects = integers; // oops!
}
  • Collection<?>表示的范圍比Collection<Object>大;

  • 無法調用objects2.add(1)是因為編譯器無法精確推斷objects2到底是哪種數據類型的容器,可能會產生運行時的類型轉換異常;

  • 表示任意數據類型集合的正確寫法是Collection<?>;

  • Collection<Object>不能表示任意類型的集合。

為什么Collection<Object>不是表示任意類型的集合呢,其實也是編譯器認為這里有類型轉換錯誤的風險:

public void testGenerics() {
   Collection<Integer> integers = new ArrayList<>();

   Collection<Object> objects = integers; // oops!
   // don't work, which type of 'objects2' contains is uncertain
   objects.add("1");

   Integer one = objects.iterator().next(); // oops! crash
}
  • Collection<Object>是可以往容器add數據的,因為Object是所有對象的父類,是已知類型,可以用obj instanceof Object判斷;

  • Collection<?>不能往容器放數據,因為? (UnknownType)是未知類型,無法判斷obj instanceof UnknownType的結果;

  • ?是表示未知類型,Object表示的是已知類型;

  • 如果Collection<Object>表示任意類型,按照墨菲定律(可能會發生的事必然會發生),那么上面例子中的crash是必然會發生的。。(又是一個線上故障)

“java泛型容器Collection如何用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永康市| 龙陵县| 仁怀市| 临安市| 阿鲁科尔沁旗| 龙川县| 开江县| 那坡县| 赫章县| 宁德市| 奈曼旗| 察雅县| 罗甸县| 通河县| 蓝田县| 东乌珠穆沁旗| 肃南| 千阳县| 专栏| 乳山市| 涟源市| 札达县| 蒙山县| 建水县| 连平县| 新建县| 虞城县| 胶州市| 娄烦县| 江城| 百色市| 沙洋县| 正蓝旗| 晴隆县| 洪泽县| 连南| 孝昌县| 尚义县| 孟州市| 赞皇县| 即墨市|