为什么钻石运营商用于类型推断Java 7中?(Why diamond operator is use

2019-07-20 00:36发布

List<String> list = new ArrayList(); 会导致编译器警告。

然而,下面的示例编译没有任何警告: List<String> list = new ArrayList<>();

我很好奇,为什么需要在所有的钻石运营商的介绍。 为什么不只是对构造类型推断,如果类型参数是不存在(因为它已经在Java静态方法做,像谷歌番石榴集合库开发)

编辑 :使用millimoose答案为出发点我看什么类型擦除实际上是,它不只是删除所有类型的信息。 编译器实际上做多一点(从复制的官方文档 ):

  • 在泛型类型与他们的区域或对象,如果类型参数是无限制更换所有类型的参数。 所产生的字节码,因此,只包含普通类,接口和方法。
  • 插入类型转换,如果需要保存类型安全。
  • 桥生成方法,扩展泛型类型保存多态性。

Answer 1:

明确的答案将有来自人谁设计的功能,但我猜想这是从使用原始类型,使编译器做一些兼容性的目的完全不同区分这一点。 :在它原始类型的表达式被多于一个的涉及泛型,一个例子在该SO问题发现巧妙地处理不同的通用螺丝了非相关集合



Answer 2:

在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>



Answer 3:

这是一个改进的一部分, Java的泛型 Java 7中。
之前,你将不得不写

final List<String> list = new ArrayList<String>();

现在,你可以写

final List<String> list = new ArrayList<>();

这相当于 - 编译器会做出来给你。 这是不一样的

final List list = new ArrayList();

这是一个无类型List



Answer 4:

通过java的图5和6的编译器所需要的完整的语法是:

List<String> list = new ArrayList<String>();

他们决定简化我们的语法,并允许未在赋值操作符两边写同一类型的参数。 然而, <>运营商仍然需要确保你明白你在做什么。 通过编写new ArrayList<>()你说:“我明白,我创建泛型类型的实例和泛型参数作为一个我在赋值的左侧声明。”



Answer 5:

有趣的情况是,其中调用与钻石和作为rawtype 编译成功 ,但产生不同的代码构造。 当与方法重载特性相混合这样的例子是可能的。 IIRC,还有的是地方OpenJDK的硬币邮件列表为例(不,我不会去尝试找到它)。

这是不能接受的具有完全相同的代码来成功地在Java SE 6和Java SE 7,但产生不同的结果。

对于我的钱,我会省略了金刚石,并且如果不同的码本可以由在7选择的推理算法(基本上相同的作为用于从J2SE 5.0方法通用型推理)产生给予警告(视为错误)。 如果你写这样的代码,它可能是不明显的工作,如果它是可编译或不反正。



Answer 6:

如果你的项目是建立在行家,在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>



文章来源: Why diamond operator is used for Type Inference in Java 7?