我正在学习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