我一直在尋找在Java Generics documentation,發現這段代碼,Java泛型捕獲列表<?>
public class WildcardError {
void foo(List<?> l) {
//This give a compile time error
l.set(0,l.get(0));
}
}
我可以理解,我們是從一個List<?>
獲取的元素,並試圖將其設置爲其他List<?>
。所以編譯器給出了一個錯誤。我的問題是,當2個列表不同時,它是有意義的,即l.set(0, m.get(0))
這裏的列表l
和m
是不同的。但在上面的例子中,l
和l
是相同的列表。爲什麼編譯器不夠聰明呢?難以實施嗎?
編輯: 我知道我可以通過一個輔助方法或使用T
代替?
的修復它。只是想知道爲什麼編譯器不會爲我做。
我一直想知道的正式理由很長一段時間。我個人認爲這是JLS中的一個缺點,因爲兩個'l'中的通配符在形式上是相同的。至少通過直覺......但是,可能在更復雜的代碼片段中,識別「相同」通配符變得更加困難 – 2012-07-16 07:53:14
是的。有可能會有一些有趣的角落案例,這將迫使規格變得相當複雜。好問題,但。這是這個問題的一個普遍性。你應該將其作爲後續發佈。 – aioobe 2012-07-16 07:55:37
OK,這是一個問題:http://stackoverflow.com/questions/11500385/how-does-the-jls-justify-that-wildcards-cannot-be-formally-used-within-methods – 2012-07-16 08:22:47