2014-06-07 33 views
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); 
      } 
     } 
    } 
+1

你的迭代器是一個原始類型;它應該是'ListIterator <?擴展Number>'(你的IDE應該警告你)。 –

+0

@Oli Charlesworth因此在JDK中使用mixin raw type和Generic? – gstackoverflow

+0

我不明白你在問什麼。這與mixins有什麼關係? –

回答

1

看代碼之後出現如果你的代碼示例是完整的,那是因爲你已經從你的ListIterator定義下降的一般信息。如果你要改變它包括通用信息會返回一個類似的編譯錯誤:

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

這一切都歸結於泛型只是語法糖的事實,它有助於編譯,但在運行時會「擦除」。

http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

相關問題