我一直在閱讀有效的Java和我遇到了無限的集合類型<?>
。但是,閱讀導致我相信,除了null
之外,您不能將任何元素放入Collection<?>
的實例中。什麼是集合<?>
所以,我的問題是這樣的:當我們只能插入null
元素時,實例化Collection<?>
的目的是什麼,因爲它似乎毫無意義。我一直在試圖弄清楚這個概念,但它似乎沒有多大意義。任何幫助將非常感激。
我一直在閱讀有效的Java和我遇到了無限的集合類型<?>
。但是,閱讀導致我相信,除了null
之外,您不能將任何元素放入Collection<?>
的實例中。什麼是集合<?>
所以,我的問題是這樣的:當我們只能插入null
元素時,實例化Collection<?>
的目的是什麼,因爲它似乎毫無意義。我一直在試圖弄清楚這個概念,但它似乎沒有多大意義。任何幫助將非常感激。
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
被稱爲
你的意思是方法而不是功能。 – blackpanther
皮爾,是的,我的壞。 – Smallhacker
考慮下面的Util方法from docs
下面的方法展示瞭如何使用一個Iterator來過濾任意集合 - 即遍歷集合刪除特定的元素。
static void filter(Collection<?> c) {
for (Iterator<?> it = c.iterator(); it.hasNext();)
if (!cond(it.next()))
it.remove();
}
這一段簡單的代碼是多態,這意味着它可以用於任何Collection
不管實施。
當您使用通配符聲明集合時,您指定集合是所有類型集合的超類型。
void printCollection(Collection<?> c) {
for (Object e : c) {
System.out.println(e);
}
}
看一看Oracle's documentation約外卡,因爲它是非常詳盡:
,當你有你想要通過所有類型的集合,讓我們說,例如一法這是非常有用的。
Collection
是所有Lists
和Sets
的最低抽象。它可以用作您可以使用的最低抽象,因爲它將在未來提供更大的靈活性,並且您的代碼更加健壯,因爲它可以處理所有的Lists
或Sets
或其他實現,甚至不需要實現。
那麼,收集是相當於Collection<Object>
的某種方式。它只是表示存儲在Collection
中的對象的通用類型是未知或者您可以使用本身爲Object
本身的任何對象的最低抽象。在這種情況下,您可以將任何對象放入Collection
,甚至可以將其與不同類型的對象混合使用。但是你必須注意在運行時將它轉換爲適當的類型,因爲你沒有提供你的Collection正在存儲的對象的類型。因此,Collection無法將對象轉換爲適合您的類型,您必須自己完成。要識別正確的類型,應在運行時使用Object instanceof SomeOtherClass
或Class.isAssignableFrom(Class)
。
也Collection
不實施get()
方法,但你可以得到Iterator
並從這個集合中獲得對象。
我認爲Effective Java認爲集合>是類型安全的。 – blackpanther
http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html – LaurentG