Java中List<T>和List<?>的区别详解

网友投稿 284 2023-02-12

Java中List<T>和List<?>的区别详解

一、简介

在List、Set、Map中经常见到,用来限制Class中的参数类型,确保Class中参数的一致性。例如:List list = new ArrayList<>();创建了一个内部参数是String类型的类,list中的操作对象都是String。>代表任意java类型,只有在不关心数据的具体类型下才使用通配符表示,但在一些情况下,需要将>传入的数据进行强转,但这样不如直接传入

另外除了>,还有 extends T>上界通配符和 super T>下界通配符。 extends T> 表示传入数据值需要是T类型或T的子类, suprt T>表示传入数据值需要是T类型或T的超类。

一般来说,>主要用于变量上,主要用于类或方法上。下图中,list的元素类型为?,但往里边添加String时,会显示出错,因为list中的类型是一个未知的java类型,不属于任何类,所以往里边添加数据时会出错。但可以从list中取出数据,取出的数据类型为Object。

建议采用的顺序是 List、List>、List

二、代码实例

List>是只读类型的,不能进行增加、修改操作。

>的各种坑

但 List>这个写法非常坑。因为,这时候通配符会捕获具体的String类型,但编译器不叫它String,而是起个临时的代号,比如”CAP#1“。所以以后再也不能往list里存任何元素,包括String。唯一能存的就是null。

List> list = new ArrayList();

list.add(http://"hello"); //ERROR

list.add(111); //ERROR

//argument mismatch; String cannot be converted to CAP#1

//argument mismatch; int cannot be converhttp://ted to CAP#1

另外如果拿List>做参数,也会有奇妙的事情发生。还是刚才Box的例子,有get()和set()两个方法,一个存,一个取。

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编程思想》。都有讲。

http://

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());}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:提供API接口的小说平台(小说采集api)
下一篇:聚合数据api(聚合数据api 看看地址能打开)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~