我注意到以下代码在netbeans中完全合法:
HashSet<String> hashSet = new HashSet<>();
然而eclipse对此并不满意,我必须像这样初始化它:
HashSet<String> hashSet = new HashSet<String>();
// or
HashSet<String> hashSet = new HashSet();
有趣的是,netbeans建议不要在初始化部分中指定类型参数,而是使用菱形运算符? 我想知道这两种方法有什么区别。 应该有人使用哪一个,以便代码可以在不同的IDE中使用而无需任何更改。
答案 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或更高。