黑马程序员技术交流社区
标题:
一个关于钻石"<>"的问题,求解答
[打印本页]
作者:
Morgan
时间:
2015-6-25 15:28
标题:
一个关于钻石"<>"的问题,求解答
本帖最后由 Morgan 于 2015-6-25 15:39 编辑
先上代码在说问题
List<String> list = new ArrayList<>();
list.add("A");
// The following statement should fail since addAll expects
// Collection<? extends String>
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