編譯下面的代碼失敗:在Java泛型是不變的?
public static void swap(List<?> list, int i, int j) {
list.set(i, list.set(j, list.get(i)));
}
,如:
Swap.java:5: set(int,capture#282 of ?) in List<capture#282 of ?> cannot be applied to (int,Object)
list.set(i, list.set(j, list.get(i)));
但是,如果我這樣做:
public static void swap(List<?> list, int i, int j) {
swapHelper(list, i, j);
}
private static <E> void swapHelper(List<E> list, int i, int j) { list.set(i, list.set(j, list.get(i)));
}
其完美的工作。
但我在這裏有一個基本的疑問。泛型被認爲是不變的,所以List<String>
不是List<Object>
的子類型,對吧?
如果是這樣,那麼如何在上述方法中,我們能夠通過List<?>
到List<E>
?這是如何工作的?
通配符的工作方式與標準is-it-possible-to-assign檢查不同。 – hexafraction