【你问我答】List<?>和List<T>的区别是什么?

问题描述:

List<?>和List<T>的区别是什么?

回答有奖:

选取一位认真回答问题的牛友,赠送200牛币!
▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~

你问我答问题汇总:点击进入

------------
#我也有问题想询问牛友,怎么办?

欢迎私信@筱茜 说明你的问题,将根据问题具体情况排期进入【你问我答】专场~
私信请注明参与【你问我答】专场哦~

你问我答 - 答问题,成大佬,拿牛币!
你问我答是牛客新栏目,每周1期几个问题,
牛友在问题贴下留下自己的知识,经验与见解,
帮助更多牛友了解更多技术相关知识!
#Java##悬赏#
全部评论
List<T>指存放类型为T的List,T是类型参数。 List中<?>是通配符,表示任何事物。 List<T>一般有两种用途:1、定义一个通用的泛型方法。2、限制方法的参数之间或参数和返回结果之间的关系。 List<T> listInit<T a,T b>这样可以限制返回结果的类型以及两个参数的类型一致 List<?>用的更多的地方是有界通配符<? extends T>: 上界通配符,表示该通配符所代表的类型是T类型的子类;适用于频繁读取。<? super T>:下界通配符,表示该通配符所代表的类型是T类型的父类;适用于频繁写入。
点赞 回复
分享
发布于 2019-08-20 21:13
1. 只看尖括号里边的!!明确点和范围两个概念 2. 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List<A>,List<B>,List<Object> 3. 如果尖括号里面带有问号,那么代表一个范围,<? extends A> 代表小于等于A的范围,<? super A>代表大于等于A的范围,<?>代表全部范围 4. 尖括号里的所有点之间互相赋值都是错,除非是俩相同的点 5. 尖括号小范围赋值给大范围,对,大范围赋值给小范围,错。如果某点包含在某个范围里,那么可以赋值,否则,不能赋值 6. List<?>和List 是相等的,都代表最大范围 ---------------------------------------------------------------------------------- 7.补充:List既是点也是范围,当表示范围时,表示最大范围
点赞 回复
分享
发布于 2019-08-20 21:16
百信银行
校招火热招聘中
官网直投
关于楼上的说法,更正一下 ?和? extends Object是不同的。虽然用起来基本没区别,但是 1 前者是***通配符,后者是上界通配符,在标准里是两个概念,编译产生的字节码标记也不同 2 前者是reifiable type,后者不是。后者在类型擦除后无运行时信息
1 回复
分享
发布于 2019-08-20 19:29
Java的数组类型是协变的,而泛型类型是不变的。对于泛型参数可以用super/extends关键字来指定泛型约束,也就是上下界
1 回复
分享
发布于 2019-08-20 19:33
T:只能存一种固定的数据类型      ?:数据类型不固定,可以存多种
点赞 回复
分享
发布于 2019-08-20 17:48
这个问题要从数组开始讲起,在java的世界里面,数组类型其实是伴生类型,言下之意就是有A类,就会有A[]类,并且B是A的子类,B[]也是A[]的子类。讲到泛型,List<T>的意思只有一个,T的容器,List<A>就是A的容器,就算B是A的子类,List<A> aList = new ArrayLIst<B>这样写也是不行的。但是有时候需要用这样的写法啊,怎么办呢,就出现了泛型的上界和下界,可以写成这样,List<? extend A> aList = new ArrayList<B>。这个写法什么意思呢??就是继承了A的元素的容器。而List<?>是List<? extends Object>的缩写。。所以是继承了Object的元素的容器,
点赞 回复
分享
发布于 2019-08-20 19:06
List<T>是泛型方法,List<?>是限制通配符。 List<T>一般有两种用途: 1、定义一个通用的泛型方法。 伪代码: public interface Dao{   List<T> getList(){}; } List<String> getStringList(){   return dao.getList();//dao是一个实现类实例 } List<Integer> getIntList(){   return dao.getList(); } 上面接口的getList方法如果定义成List<?> ,后面就会报错。 2、限制方法的参数之间或参数和返回结果之间的关系。 List<T> getList<T param1,T param2> 这样可以限制返回结果的类型以及两个参数的类型一致。 List<?>一般就是在泛型起一个限制作用。 伪代码: public Class Fruit(){} public Class Apple extends Fruit(){} public void test(? extends Fruit){}; test(new Fruit()); test(new Apple()); test(new String()); //这个就会报错 这样可以现在test方法的参数必须是Fruit或其子类。
点赞 回复
分享
发布于 2019-08-20 21:16

相关推荐

点赞 6 评论
分享
牛客网
牛客企业服务