我不能把握什麼是錯在這裏不兼容的類型:SomeX不能轉換到捕獲#1
import java.util.*;
class Main {
private static class SomeX {}
void doSomethingWithX(SomeX someX) {
Collection<? extends SomeX> colectionOfX = new ArrayList<>();
colectionOfX.add(someX);
}
}
javac
說以下內容:
Main.java:8: error: method add in interface Collection<E> cannot be applied to given types; colectionOfX.add(someX); ^ required: CAP#1 found: SomeX reason: argument mismatch; SomeX cannot be converted to CAP#1 where E is a type-variable: E extends Object declared in interface Collection where CAP#1 is a fresh type-variable: CAP#1 extends SomeX from capture of ? extends SomeX
據我瞭解extends
限制CAP#1的下限到SomeX
和SomeX
本身應該滿足限制。
怎麼了? (編譯時javac 1.8.0_102
)
所以......所有這些都不回答「爲什麼我不能將SomeX'實例添加到'Collection <?extends SomeX>'」中的問題。該特定操作有什麼問題? –
@XtraCoder正如我試圖解釋的那樣,'Collection <?擴展SomeX> colectionOfX'不接受'SomeX'的所有實例。即使你給它分配了'new ArrayList()',你應該可以添加'SomeX'的任何實例,編譯器不能知道它,因爲它只依賴於編譯時類型,集<?擴展SomeX>'。 –
Eran