真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java泛型容器Collection如何用

本篇內(nèi)容介紹了“java泛型容器Collection如何用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

保德網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

先簡(jiǎn)單來段例子:

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

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

這個(gè)例子其實(shí)有點(diǎn)反人類,估計(jì)大部分人(包括我)對(duì)這種轉(zhuǎn)換的第一反應(yīng)肯定是“當(dāng)然是對(duì)的”(這就掉坑了),說下我的理解:

  • Collection:表示這個(gè)Collection里包含的都是Number類型的對(duì)象,可以是Integer/Long/Float,因?yàn)榫幾g器可以判斷obj instanceof Number == true;

  • Collection:表示這個(gè)Collection是Number類型的“某個(gè)子類型”的Collection實(shí)例,可以是Collection/Collection,所以調(diào)用numbers2.add(1)是不行的,因?yàn)榫幾g器不知道這個(gè)numbers2包含的元素到底是Number的哪個(gè)子類型,編譯器無(wú)法判斷obj instanceof UnknownType的結(jié)果;

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

再來個(gè)例子:

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

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

  • Collection == Collection

不成立呢,我們?cè)賮砜磦€(gè)例子:

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

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

如果line 1成立,那么接下去獲取利潤(rùn)將會(huì)得到個(gè)負(fù)數(shù),后續(xù)的一系列計(jì)算都會(huì)發(fā)聲異常,如果代碼不夠健壯甚至可能會(huì)拋出一些意料之外的RuntimeException,導(dǎo)致方法不正常結(jié)束甚至程序crash。

所以一句話,Collection != Collection是為了運(yùn)行期的安全,將可能發(fā)生的類型轉(zhuǎn)換異常在編譯期就解決掉。

現(xiàn)在再來說說Collection與Collection,又是很多人(包括我)第一反應(yīng)肯定是“Object是所有java對(duì)象的公共父類,所以Collection可以表示任意類型的集合”,來看個(gè)例子:

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

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