<t>和&lt;&gt;之间的差异

时间:2015-08-13 16:02:47

标签: java generic-programming

我注意到以下代码在netbeans中完全合法:

HashSet<String> hashSet = new HashSet<>();

然而eclipse对此并不满意,我必须像这样初始化它:

HashSet<String> hashSet = new HashSet<String>();
// or
HashSet<String> hashSet = new HashSet();

有趣的是,netbeans建议不要在初始化部分中指定类型参数,而是使用菱形运算符? 我想知道这两种方法有什么区别。 应该有人使用哪一个,以便代码可以在不同的IDE中使用而无需任何更改。

4 个答案:

答案 0 :(得分:4)

菱形<>用于Generic Type Inference,这是Java 7中引入的一项功能。

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

执行此操作需要编译器“智能”,并确定真正的含义是:

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

这就是为什么当Java 5中的泛型首次出现时它不存在。它后来被添加为Java 7中的语法糖。

答案 1 :(得分:3)

Java 7的通用类型推断

来自Oracle的documentation

只要编译器可以从上下文中推断出类型参数,就可以用一组空的类型参数(&lt;&gt;)替换调用泛型类的构造函数所需的类型参数。这对尖括号被非正式地称为钻石。 例如,请考虑以下变量声明:

Map<String, List<String>> myMap = new HashMap<String, List<String>>();

在Java SE 7中,您可以使用一组空类型参数(&lt;&gt;)替换构造函数的参数化类型:

Map<String, List<String>> myMap = new HashMap<>();

请注意,要在泛型类实例化期间利用自动类型推断,必须指定菱形。在以下示例中,编译器生成未经检查的转换警告,因为HashMap()构造函数引用HashMap原始类型,而不是Map<String, List<String>>类型:

Map<String, List<String>> myMap = new HashMap(); //未经检查的转化警告

答案 2 :(得分:2)

&LT;&GT;当完整泛型类型可以从变量声明派生时,只是语法糖。

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

在这种情况下,声明中的类型是明确的。从java 1.7及以后版本开始有效。将IDE设置为正确的版本(或您的maven项目)。

答案 3 :(得分:1)

正如user432所述,您的eclipse编译器合规性级别可能设置得太低。钻石操作员直到Java 1.7才被引入。

要解决此问题,请打开Window&gt;偏好&gt; Java&gt;编译并将Compiler compliance level设置为1.7或更高。