A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不胖的胖子 中级黑马   /  2013-5-31 10:16  /  1684 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 不胖的胖子 于 2013-5-31 23:46 编辑

在看泛型的时候,对通配符一直都很纠结。
List<String>  list = new ArrayList<String>;正确  这是多态的实现
List<Object> list = new List<String>; 错误 泛型参数不考虑继承
问题来了
List<? extends Number> list = new ArrayList<Double>();
这是怎么回事??

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

8 个回复

倒序浏览
这个问题也是我想问的。。。  
回复 使用道具 举报
本帖最后由 小发 于 2013-5-31 12:56 编辑

张孝祥老师基础加强中讲了。
使用?通配符可以引用其它各种参数化的类型,?通配符定义的变量主要用于引用,可以调用与参数无关的方法,不能调用与参数化有关的方法。

/*List<Integer> list = new ArrayList<Integer>();
  list.add(1);
  list.add(2);
  System.out.println(list.size());
  System.out.println(list);*/


/*List<? extends Number> list = new ArrayList<Double>();*/          //能编译通过

/*List<? extends Number> list = new ArrayList<Double>();
  list.add(1);
  list.add(2);*/       编译失败

/*List<? extends Number> list = new ArrayList<Double>();
  System.out.println(list.size());*/ 编译通过,并求出size=0

因此,以上代码也说明了一个问题,就是在? extends E这种通配符引用的数据类型中,如果向其中增加数据操作的话会有问题。
所以向其中增加数据是不允许的。但是我们可以从其中来读取数据。
如下面代码:
  1. import java.util.*;
  2. class Test
  3. {
  4. public static void main(String[] args)
  5. {
  6. List <Double> list1=new ArrayList<Double>();
  7. list1.add(1.234);
  8. list1.add(2.123);
  9. list1.add(1.0098);


  10. List <Integer> list2=new ArrayList<Integer>();
  11. list2.add(1);
  12. list2.add(1);
  13. list2.add(1);
  14. printcoll(list2);
  15. }
  16. public static void printcoll(List<?extends Number> list)
  17. {
  18. Iterator<?extends Number> it=list.iterator();
  19. while(it.hasNext())
  20. {
  21. System.out.println(it.next());
  22. }
  23. }
  24. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
<? extends Number>泛型向上限定,要求必须是他本身及其子类引用类型,右边对象接受了Double,是Number的类型,所以编译可以通过!也就是你可以把左边现在也看成是Double的!
对于泛型,其实要求就是两边都有泛型,两边要一致,否则编译不通过,一边有泛型,一边没有,编译没问题!
回复 使用道具 举报
一般泛型两边类型要一样,要不会再编译的时候报错,使用通配泛型<? extends Number> 可以接收Number类型或者Number的子类型。上限

顺便给你看看泛型其他的方法:
? 通配符。也可以理解为占位符。

泛型的限定;

? extends E: 可以接收E类型或者E的子类型。上限。

? super E: 可以接收E类型或者E的父类型。下限
你可以参考我的博客:http://blog.sina.com.cn/s/blog_b8aefad101017z3c.html,希望可以帮到 l z 你。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
于腾飛 发表于 2013-5-31 11:20

谢谢!我再看看资料和视频
回复 使用道具 举报
小羽天空 发表于 2013-5-31 11:37
一般泛型两边类型要一样,要不会再编译的时候报错,使用通配泛型

谢谢!正在看你的博客!!
回复 使用道具 举报
? extends Number 的意思是 只要是Number 和 Number的子类都可以匹配上。
所以能通过了。
回复 使用道具 举报
小发 发表于 2013-5-31 11:16
张孝祥老师基础加强中讲了。
使用?通配符可以引用其它各种参数化的类型,?通配符定义的变量主要用于引用 ...

谢谢!!
面试结束了
写了点面试的总结帖
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马