2013-06-27 80 views
8

捕捉通配符從this甲骨文的Java教程:在Java泛型

的WildcardError例如產生捕獲錯誤時,編譯:

public class WildcardError { 

    void foo(List<?> i) { 
     i.set(0, i.get(0)); 
    } 
} 

此錯誤示範後,他們通過解決問題輔助方法:

public class WildcardFixed { 
    void foo(List<?> i) { 
     fooHelper(i); 
    } 

    // Helper method created so that the wildcard can be captured 
    // through type inference. 
    private <T> void fooHelper(List<T> l) { 
     l.set(0, l.get(0)); 
    } 
} 

一,th EY說,列表輸入參數(i)被看作是一個Object

在該示例中,編譯器處理i輸入參數爲類型對象的 。

爲什麼i.get(0)不返回Object?如果它已經通過這樣的話?

此外,如果您必須使用使用<T>的輔助方法,則使用<?>的意義何在。直接使用T可以推斷哪個更好?

+0

這就是Eclipse給我的:類型List 中的方法set(int,capture#1 of?)不適用於參數(int,capture#2) ?)'聽起來更荒謬。 –

+0

我剛剛寫了一個[解答](http://stackoverflow.com/questions/30797805/understanding-a-captured-type-in​​-java/30798066#30798066),解釋了另一個問題的通配符捕獲。這些信息似乎也適用於這個問題。 – Lii

回答

4

List<?>確實意味着未知類型的對象列表,它與List<Object>不一樣。

因爲我們不知道的i.get(0)列表結果元素的類型由Java的視爲Object,而不能添加到ObjectList<?>。萬一你的Java可能更聰明,但在更復雜的代碼中使用<?>通配符時,很容易使它不安全。

+0

據我記得,這種情況是由Joshua Bloch –

+0

的「Effective Java」中的細節解釋**列表 **相當於** List <?擴展對象> ** – Raf