Java 为什么我不能通过上界引用修改集合,但可以通过其迭代器修改集合?
但如果我这样写:Java 为什么我不能通过上界引用修改集合,但可以通过其迭代器修改集合?,java,generics,collections,wildcard,type-erasure,Java,Generics,Collections,Wildcard,Type Erasure,但如果我这样写: [999, 2, 3, 4, 5] 如果代码示例已完成,那是因为您已从ListIterator定义中删除了泛型信息。如果将其更改为包含通用信息,则会返回类似的编译错误: public static void reverse(List<?> list) { int size = list.size(); if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
[999, 2, 3, 4, 5]
如果代码示例已完成,那是因为您已从ListIterator定义中删除了泛型信息。如果将其更改为包含通用信息,则会返回类似的编译错误:
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);
}
}
}
list您的迭代器是原始类型;它应该是ListIterator@Oli因此,JDK中的Charlesworth使用mixin原始类型和泛型?我不明白你在问什么。这与mixin有什么关系?我是关于同时使用原始类型和泛型类型的。我听说这是一种糟糕的风格
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
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);
}
}
}
List<? extends Number> list1 = new ArrayList<Number>(){
{addAll(Arrays.asList(1,2,3,4,5));}
};
ListIterator<? extends Number> listIterator = list1.listIterator();
listIterator.next();
listIterator.set(999);
System.out.println(list1);
List<? extends Number> list1 = new ArrayList<Number>(){
{addAll(Arrays.asList(1,2,3,4,5));}
};
List list2 = list1;
list2.set(0,999);