2013-08-20 56 views
13

我一直在閱讀有效的Java和我遇到了無限的集合類型<?>。但是,閱讀導致我相信,除了null之外,您不能將任何元素放入Collection<?>的實例中。什麼是集合<?>

所以,我的問題是這樣的:當我們只能插入null元素時,實例化Collection<?>的目的是什麼,因爲它似乎毫無意義。我一直在試圖弄清楚這個概念,但它似乎沒有多大意義。任何幫助將非常感激。

+0

我認爲Effective Java認爲集合是類型安全的。 – blackpanther

+0

http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html – LaurentG

回答

24

Collection<?>允許您創建接受任何類型的Collection作爲參數的方法。舉例來說,如果你想返回true如果在Collection任何元素等於某個值的方法,你可以做這樣的事情:

Set<String> strings = loadStrings(); 
collectionContains(strings, "pizza"); 

Collection<Integer> ints = Arrays.toList(1, 2, 3, 4, 5); 
collectionContains(ints, 1337); 

List<Collection<?>> collections = new ArrayList<>(); 
collectionContains(collections, ILLEGAL_COLLECTION); 

public boolean collectionContains(Collection<?> collection, Object toCompareTo) { 
    for (Object o : collection) { 
     if (toCompareTo.equals(o)) return true; 
    } 
    return false; 
} 

這種方法可以通過任何類型的Collection被稱爲

+0

你的意思是方法而不是功能。 – blackpanther

+1

皮爾,是的,我的壞。 – Smallhacker

5

考慮下面的Util方法from docs

下面的方法展示瞭如何使用一個Iterator來過濾任意集合 - 即遍歷集合刪除特定的元素。

static void filter(Collection<?> c) { 
    for (Iterator<?> it = c.iterator(); it.hasNext();) 
     if (!cond(it.next())) 
      it.remove(); 
} 

這一段簡單的代碼是多態,這意味着它可以用於任何Collection不管實施

1

當您使用通配符聲明集合時,您指定集合是所有類型集合的超類型。

void printCollection(Collection<?> c) { 
    for (Object e : c) { 
     System.out.println(e); 
    } 
} 

看一看Oracle's documentation約外卡,因爲它是非常詳盡:

,當你有你想要通過所有類型的集合,讓我們說,例如一法這是非常有用的。

1

Collection是所有ListsSets的最低抽象。它可以用作您可以使用的最低抽象,因爲它將在未來提供更大的靈活性,並且您的代碼更加健壯,因爲它可以處理所有的ListsSets或其他實現,甚至不需要實現。

那麼,收集是相當於Collection<Object>的某種方式。它只是表示存儲在Collection中的對象的通用類型是未知或者您可以使用本身爲Object本身的任何對象的最低抽象。在這種情況下,您可以將任何對象放入Collection,甚至可以將其與不同類型的對象混合使用。但是你必須注意在運行時將它轉換爲適當的類型,因爲你沒有提供你的Collection正在存儲的對象的類型。因此,Collection無法將對象轉換爲適合您的類型,您必須自己完成。要識別正確的類型,應在運行時使用Object instanceof SomeOtherClassClass.isAssignableFrom(Class)

Collection不實施get()方法,但你可以得到Iterator並從這個集合中獲得對象。