簡體   English   中英

捕獲Java泛型中的通配符

[英]Capturing wildcards in Java generics

這個 Oracle 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));
    }
}

首先,他們說列表輸入參數( i )被視為一個Object

在此示例中,編譯器將i輸入參數處理為Object類型。

為什么然后i.get(0)不返回Object 如果已經這樣傳遞了?

此外,當使用<T>時必須使用輔助方法時,使用<?>的重點是什么。 直接使用可以推斷的T會不會更好?

List<?>表示未知類型的對象列表,它與List<Object>

因為我們不知道列表中元素的類型,所以i.get(0)結果被Java視為Object ,並且您不能將Object添加到List<?> 如果你的Java可以更聰明,但是在帶有<?>通配符的更復雜的代碼中,很容易使它不安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM