【问题标题】:Difference between <T> and <> [duplicate]<T> 和 <> 之间的区别 [重复]
【发布时间】:2015-11-06 17:12:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的 Eclipse 语言级别设置为 6 或更低,不允许在 Java 7 中引入菱形运算符 &lt;&gt;

标签: java generic-programming


【解决方案1】:
当可以从变量声明中派生完整的泛型类型时,

只是语法糖。

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

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

【讨论】:

    【解决方案2】:

    菱形&lt;&gt; 用于Generic Type Inference,这是Java 7 中引入的一项功能。

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

    这样做需要编译器“聪明”,并弄清楚您真正的意思是:

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

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

    【讨论】:

      【解决方案3】:

      正如 user432 所说,您的 Eclipse 编译器合规级别可能设置得太低。钻石运算符直到 Java 1.7 才引入。

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

      【讨论】:

        【解决方案4】:

        Java 7 的泛型类型推断

        来自 Oracle 的documentation

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

        Map&lt;String, List&lt;String&gt;&gt; myMap = new HashMap&lt;String, List&lt;String&gt;&gt;();

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

        Map&lt;String, List&lt;String&gt;&gt; myMap = new HashMap&lt;&gt;();

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

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

        【讨论】:

          猜你喜欢
          • 2014-10-12
          • 2017-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-15
          • 2016-03-15
          • 2011-05-19
          相关资源
          最近更新 更多