List<String> list = new ArrayList();
会导致编译器警告。
然而,下面的示例编译没有任何警告: List<String> list = new ArrayList<>();
我很好奇,为什么需要在所有的钻石运营商的介绍。 为什么不只是对构造类型推断,如果类型参数是不存在(因为它已经在Java静态方法做,像谷歌番石榴集合库开发)
编辑 :使用millimoose答案为出发点我看什么类型擦除实际上是,它不只是删除所有类型的信息。 编译器实际上做多一点(从复制的官方文档 ):
- 在泛型类型与他们的区域或对象,如果类型参数是无限制更换所有类型的参数。 所产生的字节码,因此,只包含普通类,接口和方法。
- 插入类型转换,如果需要保存类型安全。
- 桥生成方法,扩展泛型类型保存多态性。
明确的答案将有来自人谁设计的功能,但我猜想这是从使用原始类型,使编译器做一些兼容性的目的完全不同区分这一点。 :在它原始类型的表达式被多于一个的涉及泛型,一个例子在该SO问题发现巧妙地处理不同的通用螺丝了非相关集合
在Java开发人员非常努力,以避免改变现有的程序的行为。 List<String> list = new ArrayList();
确实编译,并创建一个原始的ArrayList。 如果类型推断施加给它的结果将是一个ArrayList<String>
,改变它的行为和可能导致运行时错误在程序的其它地方。
================================================== ==========================
进一步考虑,并通过@millimoose评论后,我看到,在行为变化将是本地的初始化,并且在编译时检测。 考虑下面的程序:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
List<Integer> integers = new ArrayList<Integer>();
integers.add(Integer.valueOf(3));
integers.add(Integer.valueOf(4));
List<String> list = new ArrayList(integers);
System.out.println(list);
}
}
无类型推断,它运行并打印[3, 4]
尽管的不希望的情况List<String>
包含整数的引用。
有了类型推断,它不会编译,因为ArrayList(Collection<? extends E> c)
不允许使用的List<Integer>
创建时,作为参数ArrayList<String>
。
这是一个改进的一部分, Java的泛型 Java 7中。
之前,你将不得不写
final List<String> list = new ArrayList<String>();
现在,你可以写
final List<String> list = new ArrayList<>();
这相当于 - 编译器会做出来给你。 这是不一样的
final List list = new ArrayList();
这是一个无类型List
。
通过java的图5和6的编译器所需要的完整的语法是:
List<String> list = new ArrayList<String>();
他们决定简化我们的语法,并允许未在赋值操作符两边写同一类型的参数。 然而, <>
运营商仍然需要确保你明白你在做什么。 通过编写new ArrayList<>()
你说:“我明白,我创建泛型类型的实例和泛型参数作为一个我在赋值的左侧声明。”
有趣的情况是,其中调用与钻石和作为rawtype 编译成功 ,但产生不同的代码构造。 当与方法重载特性相混合这样的例子是可能的。 IIRC,还有的是地方OpenJDK的硬币邮件列表为例(不,我不会去尝试找到它)。
这是不能接受的具有完全相同的代码来成功地在Java SE 6和Java SE 7,但产生不同的结果。
对于我的钱,我会省略了金刚石,并且如果不同的码本可以由在7选择的推理算法(基本上相同的作为用于从J2SE 5.0方法通用型推理)产生给予警告(视为错误)。 如果你写这样的代码,它可能是不明显的工作,如果它是可编译或不反正。
如果你的项目是建立在行家,在pom.xml中添加下面的标记下。 它完美.. <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>