以下代碼不能在Eclipse中編譯。它說: 「在美國廣播公司型的方法putHelper(列表,INT,E)是不適用的參數(列表< .capture#8的擴展E>」,INT,E)」通用方法捕獲通配符類型的專用幫助程序方法
private <E> void putHelper(List<E> list, int i, E value) {
list.set(i, value);
}
public <E> void put(List<? extends E> list, int toPos, E value) {
// list.set(toPos,value);
putHelper(list, toPos, value);
}
我不明白爲什麼會這樣?因爲 下面的代碼工作正常。
public <E> void put(List<? extends E> list,int fromPos, int toPos) {
putHelper(list,fromPos,toPos);
}
private <E> void putHelper(List<E> list,int i, int j) {
list.set(j,list.get(i));
}
而且據我所知,這裏的輔助方法,是能夠捕捉到通配符類型,但爲什麼不能在前面的代碼?
編輯:在第三種情況下,如果我在put方法中將類型參數更改爲Li st <。? super E>,當我嘗試從另一個接受列表的方法調用put()方法時,Eclipse不編譯它。它說:「類型Abc中放置的方法(列表<。?super E>,int,E)不適用於參數(列表<。捕獲#6 - 擴展E>」,int,E)「
public static <E> void insertAndProcess(List<? extends E> list) {
// Iterate through the list for some range of values i to j
E value = list.get(i);
//Process the element and put it back at some index
put(list, i+1, value);
//Repeat the same for few more elements
}
private static <E> void putHelper(List<E> list, int i, E value) {
list.set(i, value);
}
public static <E> void put(List<? super E> list, int toPos, E value) {
putHelper(list, toPos, value);
}
這裏,insertAndProcess()怎麼能叫put()方法,並用它在執行,同時用戶還可以可以這兩種方法調用與說的ArrayList < .Integer>?
謝謝您的解釋。在代碼工作的第二種情況下,是List消費者還是生產者?我編輯了這個問題並添加了另一個案例,請幫助第三個案例。 – shujin
@shujin編輯我的回答以解決新問題 – dkatzel
謝謝你的回答。那麼,我想通過傳遞類型列表(比如Number)來限制對方法insertAndProcess()的調用,只是因爲它使用了某種特定的類型實現,所以我需要使用 extends E>。我想,現在我不得不在課堂上限制它。 – shujin