邏輯上,static double sumOfList(List<? extends Double> list)會使函式變成只讀模式,那為什么list.remove()還能編譯成功
public class Extend_char {
public static void main(String[] args) {
{
List<Double> list = new ArrayList<>();
list.add(1.2);
list.add(2.2);
list.add(3.2);
System.out.println(sumOfList(list));
System.out.println(list);
}
static double sumOfList(List<? extends Double> list) {
double sum = 0;
for (int i=0; i<list.size(); i ) {
double n = list.get(i);
sum = sum n;
}
//list.add(new Double(5.5)); Cannot compile and call normally
list.remove(2.2); //Can compile and call normally
return sum;
}
}
uj5u.com熱心網友回復:
邏輯上,static double sumOfList(List<? extends Double> list) 會使函式變成只讀模式
看,這就是編程的問題。這太復雜了——所以我們提供了過于簡單的解釋。
你一直是這件事的受害者。List<? extends Double>是不是一個“只讀串列”。
但是我可以看到試圖提供幫助的人是如何告訴你的。
看,重點List<? extends Something>是它可以讓您提供一個List<Something>, 或List<SomeChildOfSomething>. 如果然后可以呼叫.add(instanceOfSomething)這樣的事情,那就是問題。
想象一下這個方法:
void foo(List<? extends Number> list) {
list.add(5); // an integer
}
List<Double> listOfDoubles = new ArrayList<Double>();
foo(listOfDoubles);
listOfDoubles.get(0); // oh dear. Now what?
看到問題了嗎?一個解決方案是確保所有會失敗的方法,除非他們知道確切的型別,否則是不允許的。add是這樣的方法。那么,addAll和set明顯的原因。你不能呼叫這些,除非你知道名單是準確的型別你傳遞給這些方法,或它的超表達的是(這就是為什么你可以呼叫.add一個List<? super Double>就好了)。
但是,修改該做的方法串列中沒有的原因等問題-基本上一切,并不需要(集合)型別T的元素,如.clear(),.remove(),removeIf,等?
那些就好了。
TL;DR:List<? extends AThingie>不是“只讀串列”。那是完全錯誤的。不過,這是一個可以理解但過于簡單化的解釋。不要對誰告訴你這些太苛刻。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/348577.html
