摘要:因為符號可以匹配任意類型,因此可以處理任意類型的數(shù)據(jù)。因為原生態(tài)類型沒有限制,所以它很容易是集合混亂,換句話說,無界通配符是安全的而原生態(tài)類型不是安全的。
我們都知道無界通配符(unbounded wildcard) Set>可以處理任意類型數(shù)據(jù),原生態(tài)類型(raw type)Set也能處理任意類型數(shù)據(jù),但是他們區(qū)別是什么呢。1、關于Set>的兩個要點。
因為符號?可以匹配任意類型,因此Set>可以處理任意類型的數(shù)據(jù)。
因為我們不知道?指的是什么類型,因此我們不能忘Set里面添加任何類型的數(shù)據(jù)。
這兩點看起來是不是很矛盾,其實并不矛盾,看下面的兩個例子
第一要點代碼如下
//代碼不報錯 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); } }
第二要點代碼如下
public static void printSet(Set> s) { s.add(10);// 本行代碼報錯 for (Object o : s) { System.out.println(o); } }
這是因為我們不知道?所指類型,因此除了null外的所有類型我們都不能往里面添加。同樣的,我們不能初始化一個Set類型為?,如下
Set> set = new HashSet>();2、Set vs Set>
看如下代碼,是不會報錯的。
public static void printSet(Set s) { s.add("2"); for (Object o : s) { System.out.println(o); } }
因為原生態(tài)類型沒有限制,所以它很容易是集合混亂,換句話說,無界通配符是安全的而原生態(tài)類型不是安全的。
3、何時使用Set>當你使用泛型(generic type),但是你又不想關心實際泛型是什么的時候,使用無界通配符。如下:
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;
轉自我的博客園 http://cnblogs.com/qins/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70862.html
類型擦除 泛型被引入到Java語言中,以便在編譯時提供更嚴格的類型檢查并支持通用編程,為了實現(xiàn)泛型,Java編譯器將類型擦除應用于: 如果類型參數(shù)是無界的,則用它們的邊界或Object替換泛型類型中的所有類型參數(shù),因此,生成的字節(jié)碼僅包含普通的類、接口和方法。 如有必要,插入類型轉換以保持類型安全。 生成橋接方法以保留擴展泛型類型中的多態(tài)性。 類型擦除確保不為參數(shù)化類型創(chuàng)建新類,因此,泛型不會...
摘要:然而中的泛型使用了類型擦除,所以只是偽泛型。總結本文介紹了泛型的使用,以及類型擦除相關的問題。一般情況下泛型的使用比較簡單,但是某些情況下,尤其是自己編寫使用泛型的類或者方法時要注意類型擦除的問題。 簡介 Java 在 1.5 引入了泛型機制,泛型本質是參數(shù)化類型,也就是說變量的類型是一個參數(shù),在使用時再指定為具體類型。泛型可以用于類、接口、方法,通過使用泛型可以使代碼更簡單、安全。然...
博客地址:Java泛型:類型擦除 前情回顧 Java泛型:泛型類、泛型接口和泛型方法 類型擦除 代碼片段一 Class c1 = new ArrayList().getClass(); Class c2 = new ArrayList().getClass(); System.out.println(c1 == c2); /* Output true */ 顯然在平時使用中,ArrayList...
摘要:可以看到,如果我們給泛型類制定了上限,泛型擦除之后就會被替換成類型的上限。相應的,泛型類中定義的方法的類型也是如此。參考語言類型擦除下界通配符和的區(qū)別 本篇博客主要介紹了Java類型擦除的定義,詳細的介紹了類型擦除在Java中所出現(xiàn)的場景。 1. 什么是類型擦除 為了讓你們快速的對類型擦除有一個印象,首先舉一個很簡單也很經典的例子。 // 指定泛型為String List list1 ...
閱讀 2000·2023-04-25 16:53
閱讀 1442·2021-10-13 09:39
閱讀 606·2021-09-08 09:35
閱讀 1639·2019-08-30 13:03
閱讀 2121·2019-08-30 11:06
閱讀 1831·2019-08-30 10:59
閱讀 3188·2019-08-29 17:00
閱讀 2288·2019-08-23 17:55