黑马程序员技术交流社区

标题: 一个关于钻石"<>"的问题,求解答 [打印本页]

作者: Morgan    时间: 2015-6-25 15:28
标题: 一个关于钻石"<>"的问题,求解答
本帖最后由 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:


作者: Deathfish    时间: 2015-6-25 15:28
泛型是一种在代码编写阶段提供给程序员的一种提醒

在编译的时候泛型都会去除的。
作者: Morgan    时间: 2015-6-25 15:43
Anyone    can do   this for me ?
作者: Morgan    时间: 2015-6-25 16:46
也不能用反射的方式验证,因为泛型类型信息只在编译时有效,编译后编译器会把泛型信息去掉,也就是去泛型化。
作者: Morgan    时间: 2015-6-26 08:10
Deathfish 发表于 2015-6-25 23:56
泛型是一种在代码编写阶段提供给程序员的一种提醒

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

恩,这个 泛型创建时的类型推断是Java 7 的新特性,我换到jdk 7结果果然报错了
作者: 天涯回望    时间: 2015-6-29 22:12
来学习一下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2