<T> 和 <> 之间的区别

Difference between <T> and <>

我注意到下面的代码在 netbeans 中是完全合法的:

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

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

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

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

<> 只是语法糖,当完整的泛型类型可以从变量声明派生时。

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

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

菱形 <> 用于 Generic Type Inference,这是 Java 7.

中引入的功能
List<String> list = new List<>();

这样做需要编译器 "smart",并弄清楚你 真正 的意思是:

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

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

正如 user432 所述,您的 Eclipse 编译器合规性级别可能设置得太低。菱形运算符直到 Java 1.7.

才被引入

要解决此问题,请打开 Window > 首选项 > Java > 编译器并将 Compiler compliance level 设置为 1.7 或更高版本。

Java 7 的通用类型推断

来自 Oracle 的 documentation:

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

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

在 Java SE 7 中,您可以用一组空的类型参数 (<>) 替换构造函数的参数化类型:

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

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

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