這篇文章主要介紹“java泛型實例代碼分析”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“java泛型實例代碼分析”文章能幫助大家解決問題。
創(chuàng)新互聯(lián)長期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為通州企業(yè)提供專業(yè)的網(wǎng)站設(shè)計、成都做網(wǎng)站,通州網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
先簡單來段例子:
public void testGenerics() {
Collection<Number> numbers = new ArrayList<>();
numbers.add(1); // ok
Collection<?> tmp = numbers;
// don't work, you don't know what type 'tmp' obviously contains
// tmp.add(1);
Collection<? extends Number> tmp2 = numbers;
// don't work, you don't know what subtype 'tmp2' obviously contains
// tmp2.add(1);
Collection<Integer> integers = new ArrayList<>();
tmp = integers;
tmp2 = integers;
Collection<String> strings = new ArrayList<>();
tmp = strings;
// tmp2 = strings; // don't work
}
這個問題其實有點反人類,估計大部分人(包括我)對這種轉(zhuǎn)換的第一反應(yīng)肯定是“當然是對的。?!保f下我的理解:
Collection<Number>:表示這個Collection里包含的都是Number類型的對象,可以是Integer/Long/Float,因為編譯器可以判斷obj instanceof Number == true;
Collection<? extends Number>:表示這個Collection是Number類型的“某個子類型”的Collection實例,可以是Collection<Integer>/Collection<Long>,所以調(diào)用tmp.add(1)是不行的,因為編譯器不知道這個tmp包含的元素到底是Number的哪個子類型,編譯器無法判斷obj instanceof UnknownType的結(jié)果;
Collection<E>,這個E類型是“一個”具體的類型,而不能是某個parent的多個子類型。
說到為什么在不明確類型的情況下不能允許寫操作,那是為了運行期的安全,舉個例子:
public void testGenerics2() {
List<Integer> integers = new ArrayList<>();
List<? extends Comparable> comparables = integers;
integers.add("1");
comparables.get(0).intValue(); // fail
}
如果comparables允許添加Comparable類型,那么運行期就有可能會拋出一些意料之外的RuntimeException,導(dǎo)致方法不正常結(jié)束甚至程序crash。
現(xiàn)在再來說說Collection<Object>與Collection<?>,又是很多人(包括我)第一反應(yīng)肯定是“Object是所有java對象的公共父類,所以Collection<Object>可以表示任意類型的集合”,來看個例子:
public void testGenerics3() {
List<Integer> integers = new ArrayList<>();
List<Object> objects = integers; // don't work
List<?> objects1 = integers; // ok
}
Collection<?>表示的范圍比Collection<Object>大;
表示任意類型集合的正確寫法是Collection<?>;
Collection<Object>不能表示任意類型的集合。
為什么Collection<Object>不是表示任意類型呢,其實也是編譯器認為這里有類型轉(zhuǎn)換錯誤的風險:
public void testGenerics4() {
List<Integer> integers = new ArrayList<>();
List<Object> objects = new ArrayList<>();
// this will be ok if List<Object> equals List<?>
// objects = strings;
// objects.add("1");
// Integer i = (Integer) objects.get(0); // and crashes
List<?> objects1 = new ArrayList<>(); // ok
// objects1.add("1"); // compiler will make it illegal
}
List<Object>是可以往集合add數(shù)據(jù)的,因為Object是所有對象的父類,是已知類型,可以用obj instanceof Object判斷;
List<?>編譯器是不允許往里面丟數(shù)據(jù)的,因為不知道List到底是哪種數(shù)據(jù)類型的集合,不能用obj instanceof UnknownType判斷;
?才是表示未知類型,Object表示的是已知類型;
如果List<Object>表示任意類型,按照墨菲定律(可能會發(fā)生的事必然會發(fā)生),那么上面例子中的crash是必然會發(fā)生的。。(又是一個線上故障)
關(guān)于“java泛型實例代碼分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。
分享標題:java泛型實例代碼分析
鏈接URL:http://muchs.cn/article32/pjjpsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、營銷型網(wǎng)站建設(shè)、云服務(wù)器、虛擬主機、域名注冊、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)