摘要:因?yàn)榉?hào)可以匹配任意類(lèi)型,因此可以處理任意類(lèi)型的數(shù)據(jù)。因?yàn)樵鷳B(tài)類(lèi)型沒(méi)有限制,所以它很容易是集合混亂,換句話說(shuō),無(wú)界通配符是安全的而原生態(tài)類(lèi)型不是安全的。
我們都知道無(wú)界通配符(unbounded wildcard) Set>可以處理任意類(lèi)型數(shù)據(jù),原生態(tài)類(lèi)型(raw type)Set也能處理任意類(lèi)型數(shù)據(jù),但是他們區(qū)別是什么呢。1、關(guān)于Set>的兩個(gè)要點(diǎn)。
因?yàn)榉?hào)?可以匹配任意類(lèi)型,因此Set>可以處理任意類(lèi)型的數(shù)據(jù)。
因?yàn)槲覀儾恢?指的是什么類(lèi)型,因此我們不能忘Set里面添加任何類(lèi)型的數(shù)據(jù)。
這兩點(diǎn)看起來(lái)是不是很矛盾,其實(shí)并不矛盾,看下面的兩個(gè)例子
第一要點(diǎn)代碼如下
//代碼不報(bào)錯(cuò) public static void main(String[] args) { HashSets1 = new HashSet (Arrays.asList(1, 2, 3)); printSet(s1); HashSet s2 = new HashSet (Arrays.asList("a", "b", "c")); printSet(s2); } public static void printSet(Set> s) { for (Object o : s) { System.out.println(o); } }
第二要點(diǎn)代碼如下
public static void printSet(Set> s) { s.add(10);// 本行代碼報(bào)錯(cuò) for (Object o : s) { System.out.println(o); } }
這是因?yàn)槲覀儾恢溃克割?lèi)型,因此除了null外的所有類(lèi)型我們都不能往里面添加。同樣的,我們不能初始化一個(gè)Set類(lèi)型為?,如下
Set> set = new HashSet>();2、Set vs Set>
看如下代碼,是不會(huì)報(bào)錯(cuò)的。
public static void printSet(Set s) { s.add("2"); for (Object o : s) { System.out.println(o); } }
因?yàn)樵鷳B(tài)類(lèi)型沒(méi)有限制,所以它很容易是集合混亂,換句話說(shuō),無(wú)界通配符是安全的而原生態(tài)類(lèi)型不是安全的。
3、何時(shí)使用Set>當(dāng)你使用泛型(generic type),但是你又不想關(guān)心實(shí)際泛型是什么的時(shí)候,使用無(wú)界通配符。如下:
public static void main(String[] args) { HashSets1 = new HashSet (Arrays.asList(1,2,3)); HashSet s2 = new HashSet (Arrays.asList(4,2,3)); System.out.println(getUnion(s1, s2)); } public static int getUnion(Set> s1, Set> s2){ int count = s1.size(); for(Object o : s2){ if(!s1.contains(o)){ count++; } } return count;
轉(zhuǎn)自我的博客園 http://cnblogs.com/qins/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/70862.html
類(lèi)型擦除 泛型被引入到Java語(yǔ)言中,以便在編譯時(shí)提供更嚴(yán)格的類(lèi)型檢查并支持通用編程,為了實(shí)現(xiàn)泛型,Java編譯器將類(lèi)型擦除應(yīng)用于: 如果類(lèi)型參數(shù)是無(wú)界的,則用它們的邊界或Object替換泛型類(lèi)型中的所有類(lèi)型參數(shù),因此,生成的字節(jié)碼僅包含普通的類(lèi)、接口和方法。 如有必要,插入類(lèi)型轉(zhuǎn)換以保持類(lèi)型安全。 生成橋接方法以保留擴(kuò)展泛型類(lèi)型中的多態(tài)性。 類(lèi)型擦除確保不為參數(shù)化類(lèi)型創(chuàng)建新類(lèi),因此,泛型不會(huì)...
摘要:然而中的泛型使用了類(lèi)型擦除,所以只是偽泛型??偨Y(jié)本文介紹了泛型的使用,以及類(lèi)型擦除相關(guān)的問(wèn)題。一般情況下泛型的使用比較簡(jiǎn)單,但是某些情況下,尤其是自己編寫(xiě)使用泛型的類(lèi)或者方法時(shí)要注意類(lèi)型擦除的問(wèn)題。 簡(jiǎn)介 Java 在 1.5 引入了泛型機(jī)制,泛型本質(zhì)是參數(shù)化類(lèi)型,也就是說(shuō)變量的類(lèi)型是一個(gè)參數(shù),在使用時(shí)再指定為具體類(lèi)型。泛型可以用于類(lèi)、接口、方法,通過(guò)使用泛型可以使代碼更簡(jiǎn)單、安全。然...
博客地址:Java泛型:類(lèi)型擦除 前情回顧 Java泛型:泛型類(lèi)、泛型接口和泛型方法 類(lèi)型擦除 代碼片段一 Class c1 = new ArrayList().getClass(); Class c2 = new ArrayList().getClass(); System.out.println(c1 == c2); /* Output true */ 顯然在平時(shí)使用中,ArrayList...
摘要:可以看到,如果我們給泛型類(lèi)制定了上限,泛型擦除之后就會(huì)被替換成類(lèi)型的上限。相應(yīng)的,泛型類(lèi)中定義的方法的類(lèi)型也是如此。參考語(yǔ)言類(lèi)型擦除下界通配符和的區(qū)別 本篇博客主要介紹了Java類(lèi)型擦除的定義,詳細(xì)的介紹了類(lèi)型擦除在Java中所出現(xiàn)的場(chǎng)景。 1. 什么是類(lèi)型擦除 為了讓你們快速的對(duì)類(lèi)型擦除有一個(gè)印象,首先舉一個(gè)很簡(jiǎn)單也很經(jīng)典的例子。 // 指定泛型為String List list1 ...
摘要:總結(jié)泛型的類(lèi)型必須是引用類(lèi)型,不能是基本類(lèi)型,泛型的個(gè)數(shù)可以有多個(gè),可以使用對(duì)創(chuàng)建對(duì)象時(shí)的泛型類(lèi)型以及方法參數(shù)類(lèi)型進(jìn)行限制,如使用關(guān)鍵字和對(duì)泛型的具體類(lèi)型進(jìn)行向下限制或向上限制,最后一點(diǎn),可以聲明泛型數(shù)組,但是不能創(chuàng)建泛型數(shù)組的實(shí)例。 自從 JDK 1.5 提供了泛型概念,泛型使得開(kāi)發(fā)者可以定義較為安全的類(lèi)型,不至于強(qiáng)制類(lèi)型轉(zhuǎn)化時(shí)出現(xiàn)類(lèi)型轉(zhuǎn)化異常,在沒(méi)有反省之前,可以通過(guò) Object...
摘要:靜態(tài)變量是被泛型類(lèi)的所有實(shí)例所共享的。對(duì)于這個(gè)類(lèi)型系統(tǒng),有如下的一些規(guī)則相同類(lèi)型參數(shù)的泛型類(lèi)的關(guān)系取決于泛型類(lèi)自身的繼承體系結(jié)構(gòu)。在代碼中避免泛型類(lèi)和原始類(lèi)型的混用。參考泛型類(lèi)型擦除 Java泛型總結(jié) Java泛型是JDK5引入的一個(gè)新特性,允許在定義類(lèi)和接口的時(shí)候使用類(lèi)型參數(shù)(type parameter)。聲明的類(lèi)型參數(shù)在使用的時(shí)候使用具體的類(lèi)型來(lái)替換。泛型最主要的應(yīng)用是在JDK5...
閱讀 2147·2023-04-25 16:53
閱讀 1544·2021-10-13 09:39
閱讀 731·2021-09-08 09:35
閱讀 1762·2019-08-30 13:03
閱讀 2265·2019-08-30 11:06
閱讀 1934·2019-08-30 10:59
閱讀 3278·2019-08-29 17:00
閱讀 2369·2019-08-23 17:55