[英]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.