1
List<? extends Number> list1 = new ArrayList<Number>(){
{addAll(Arrays.asList(1,2,3,4,5));}
};
ListIterator listIterator = list1.listIterator();
listIterator.next();
listIterator.set(999);
System.out.println(list1);
此代碼的工作和奏爲什麼我不能通過有界的引用修改集合,但可以通過它的迭代器?
[999, 2, 3, 4, 5]
但如果我寫了這麼:
List<? extends Number> list1 = new ArrayList<Number>(){
{addAll(Arrays.asList(1,2,3,4,5));}
};
list1.set(0,999);
我看到
java: method set in interface java.util.List<E> cannot be applied to given types;
required: int,capture#1 of ? extends java.lang.Number
found: int,int
reason: actual argument int cannot be converted to capture#1 of ? extends java.lang.Number by method invocation conversion
普萊舍澄清這種行爲。
P.S. 這個問題是從
Collections.reverse
方法
public static void reverse(List<?> list) {
int size = list.size();
if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)
swap(list, i, j);
} else {
ListIterator fwd = list.listIterator();
ListIterator rev = list.listIterator(size);
for (int i=0, mid=list.size()>>1; i<mid; i++) {
Object tmp = fwd.next();
fwd.set(rev.previous());
rev.set(tmp);
}
}
}
你的迭代器是一個原始類型;它應該是'ListIterator <?擴展Number>'(你的IDE應該警告你)。 –
@Oli Charlesworth因此在JDK中使用mixin raw type和Generic? – gstackoverflow
我不明白你在問什麼。這與mixins有什麼關係? –