2013-03-21 66 views
6

我最近在Java上進行了一次考試,關於Java中通配符泛型的內容很廣泛。然而,在實踐中對他們的使用很少有人說。我們應該何時使用它們?讓我們來看一個典型的用法:Java中通配符泛型的實際用法

void check(Collection<? extends Animal> list) { 
    // Do something 
} 

該文檔說,這個集合不允許添加任何元素到列表中。所以基本上可以使用通配符使集合成爲只讀。這是他們唯一的用法嗎?這有什麼實際需要嗎?在過去的四年中,我參與了很多Java編程項目,但是我還沒有看到任何可以廣泛使用通配符這樣的功能的項目。

因此,從實際的角度來看,有沒有什麼情況下通配符的泛型是不可避免的和必要的?

+0

基礎上的矛盾的答案,你的問題是相當不錯的。 :-) – 2013-03-21 06:56:00

回答

3

那麼從實際的角度來看,有沒有什麼情況下 通配符的泛型是不可避免的和必要的?

我不認爲它們是'不可避免的和必要的',因爲Java編譯器無論如何都會擦除它們。但是,在使用它們時,您可以在編譯期間獲得更緊密的類型檢查,避免類型轉換。誰又想打字?:)

Guidelines for Wildcard Use

Type Erasure

+0

謝謝,我有點錯過了這個指南,它解釋了wildard使用的基本規則 – 2013-03-21 07:24:15

1
void check(Collection<? extends Animal> list) { 
    list.add(new Animal()); // compile time error 
    list.add(new Dog()); // compile time error. Dog is subclass of Animal class. 
} 

Java有開發此類仿製藥,因爲被設置爲禁止programmar代碼任何他們希望,否則,如果它被允許再後來,他們會發現在運行時環境一團糟。

有時在編程中,您會得到一個方案,您的方法check不會在列表中添加元素,但想要讀取這些元素。

您只能添加null值。

+0

你是對的,但請引用一個文件。這聽起來很奇怪 – 2013-03-21 07:04:19

0

簡而言之,你所說的是錯誤的。

它與「使集合爲只讀」無關。

我們仍然可以將元素添加到輸入列表中,因爲Collection確實聲明瞭add(E)方法。

通配符是直截了當我認爲:您實際上想限制輸入類型,因爲您的邏輯對於某些類型是合理的。

對於你的榜樣,您的支票可能使用動物

void check(Collection<? extends Animal> list) { 
    // Do something 
    for (Animal a : list) { 
    a.checkAge(); // checkAge() is method of Animal 
    } 
} 

的一些方法,無需? extends Animal,上面的代碼將無法正常工作,因爲進入的列表可以是任何東西(不是動物)集合。

因此,我們要確保傳入收集集合或集合等,以便我們的代碼實際上是有意義的,因爲我們從列表中檢索元素並將元素視爲動物。