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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Morgan 中级黑马   /  2015-6-25 15:28  /  2175 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

2黑马币
本帖最后由 Morgan 于 2015-6-25 15:39 编辑

先上代码在说问题
  1. List<String> list = new ArrayList<>();
  2. list.add("A");

  3.   // The following statement should fail since addAll expects
  4.   // Collection<? extends String>

  5. list.addAll(new ArrayList<>());
复制代码

正如注释说的那样,最后一行因该是编译不成功的,理由如下:
1,首先list所引用的ArrayList的泛型类型参数被钻石(就是"<>",之所以叫它钻石是因为它长的很像钻石)也就是编译器自动类型推断为String.
2,在这种情况下list的addAll方法需要的实参类型应该是Collection<? extends String>类型。但是new ArrayList<>() 中的钻石会被推断成Object。
3,前面需要的是存储String或者其子类的集合后面给的是一个存储Object类型的集合,那么问题来了Object是String的子类吗?显然不是,反过来才对。所以结论:编译失败。


可问题就是为啥我的机器编译成功了呢?我的jdk是最新版本的,跟这个没关系吧,而且上面的例子还是Java的官方文档举的。:funk:

最佳答案

查看完整内容

泛型是一种在代码编写阶段提供给程序员的一种提醒 在编译的时候泛型都会去除的。

5 个回复

倒序浏览
泛型是一种在代码编写阶段提供给程序员的一种提醒

在编译的时候泛型都会去除的。
回复 使用道具 举报
Anyone    can do   this for me ?
回复 使用道具 举报
也不能用反射的方式验证,因为泛型类型信息只在编译时有效,编译后编译器会把泛型信息去掉,也就是去泛型化。
回复 使用道具 举报
Deathfish 发表于 2015-6-25 23:56
泛型是一种在代码编写阶段提供给程序员的一种提醒

在编译的时候泛型都会去除的。 ...

恩,这个 泛型创建时的类型推断是Java 7 的新特性,我换到jdk 7结果果然报错了
回复 使用道具 举报
来学习一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马