<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();
// 未经检查的转换警告
我注意到下面的代码在 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();
// 未经检查的转换警告