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);