另外除了>,还有 extends T>上界通配符和 super T>下界通配符。 extends T> 表示传入数据值需要是T类型或T的子类, suprt T>表示传入数据值需要是T类型或T的超类。
一般来说,>主要用于变量上,
建议采用的顺序是 List
List>是只读类型的,不能进行增加、修改操作。
>的各种坑但 List>这个写法非常坑。因为,这时候通配符会捕获具体的String类型,但编译器不叫它String,而是起个临时的代号,比如”CAP#1“。所以以后再也不能往list里存任何元素,包括String。唯一能存的就是null。
List> list = new ArrayList(); list.add("hello"); //ERROR list.add(111); //ERROR //argument mismatch; String cannot be converted to CAP#1 //argument mismatch; int cannot be converted to CAP#1
另外如果拿List>做参数,也会有奇妙的事情发生。还是刚才Box
class Box{ private List item; public List get(){return item;} public void set(List t){item=t;} //把item取出来,再放回去 public void getSet(Box> box){box.set(box.get());} //ERROR }
新的getSet()方法,只是把item先用get()方法读出来,然后再用set()方法存回去。按理说不可能有问题。实际运行却会报错。
error: incompatible types: Object cannot be converted to CAP#1
原因和前面一样,通配符box>.set()的参数类型被编译器捕获,命名为CAP#1,和box>.get()返回的Object对象无法匹配。
解决方法,是要给getSet()方法写一个 辅助函数,具体原理可以去查《Java核心技术-卷1》,泛型这章,或者《Java编程思想》。都有讲。
class Box{ private List item; public List get(){return item;} public void set(List t){item=t;} //helper()函数辅助getSet()方法存取元素 public void getSet(Box> box){helper(box);} public void helper(Box box){box.set(box.get());} }
到此这篇关于Java中List<T>和List<?>的区别详解的文章就介绍到这了,更多相关List<T>和List<?>内容请搜索考高分网以前的文章或继续浏览下面的相关文章希望大家以后多多支持考高分网!



