我正在學習Java泛型,我正在閱讀Naftalin和Wadler編寫的(非常好的)一本書,並且他談到了捕獲通配符的通配符,比如實現在Collections.reverse:Java泛型在通用方法中捕獲通配符
public static <T> void reverse(List<T> list){
List<T> temp=new ArrayList<>(list);
for(int i=0;i<list.size();i++)
list.set(i,temp.get(list.size()-1-i));
}
他說,在集合類中的方法是使用通配符簡單實現:
public static void reverse(List<?> list){
//code..
}
,但使用第一種方法體是行不通的:
public static void reverse(List<?> list){
List<Object> temp=new ArrayList<Object>(list); //legal
for(int i=0;i<list.size();i++)
list.set(temp.get(list.size()-1-i)); //illegal
}
這是行不通的,因爲它試圖把一個對象類型元素的列表 類型未知(?),它是一切擴展對象(這是..well,一切)
因此調用從第二第一種方法應該做的伎倆:
public static void reverse1(List<?> list){
reverse2(list);
}
public static <T> void reverse2(List<T> list){
List<T> temp=new ArrayList<T>(list);
for(int i=0;i<list.size();i++)
list.set(i,temp.get(list.size()-1-i));
}
至此,繼在方法調用發生的事情,例如傳遞
List<String> myList
1)List<String> myList
被上澆鑄到本地變量String<?> list
(字符串延伸對象,這是上限通配符的,使得List<String>
亞型List<?>
)
2)list
現在傳遞給reverse2()
和參數T是推斷爲? extends Object
,現在我怎麼可以使用這個作爲參數,當我實例化新ArrayList<T>()
???這在Java代碼中顯然是非法的,所以其他事情必須發生,請問你是什麼?
感謝
盧卡
我沒有看到這裏的任何東西正在實例化'ArrayList >'。請圍繞代碼片段(以及任何需要'<' and '>'被正確渲染的代碼文本)用反引號(又名反引號'''')。或者您可以突出顯示文本並按下「{}」按鈕。 – rgettman
@rgettman完成。我通過類型參數,因爲我調用的方法..我不明白我怎麼能寫方法體傳遞?作爲類型參數。 – Luca