【问题标题】:Why does new HashMap<> produce an error in JDK 1.6 but not 1.7为什么 new HashMap<> 在 JDK 1.6 而不是 1.7 中产生错误
【发布时间】:2013-05-17 14:58:06
【问题描述】:

我注意到以下代码在 Eclipse 中使用 java spec 1.7 编译时有效,但不适用于 1.6。

HashMap<String, String> hashMap = new HashMap<>();

我想要一个解释,但是这个语法以及为什么它适用于 1.7。

【问题讨论】:

  • 这个运算符有什么意义?
  • 它用于类型推断,同时也告诉编译器“嘿,这不是原始类型”。您可以在我链接到的帖子中看到我的答案。
  • 减少视觉噪音,仅此而已。

标签: java generics


【解决方案1】:

JDK 1.6 中不允许使用 new HashMap&lt;&gt;()(称为菱形语法),因为它仅在 Java SE 7 中引入。

Highlights of Technology Changes in Java SE 7中寻找Type Inference for Generic Instance Creation

我想要一个解释,但是这个语法以及为什么它适用于 1.7。

这是来自Oracle itself的解释(稍作改编):

Java SE 7 之前版本的编译器能够推断泛型构造函数的实际类型参数,类似于泛型方法。但是,如果您使用菱形 (&lt;&gt;),Java SE 7 中的编译器可以推断出被实例化的泛型类的实际类型参数。考虑以下示例,该示例适用于 Java SE 7 及更高版本:

class MyClass<X> {
  <T> MyClass(T t) {
    // ...
  }
}

 

MyClass<Integer> myObject = new MyClass<>("");

在此示例中,编译器推断泛型类MyClass&lt;X&gt; 的形式类型参数X 的类型Integer。它推断该泛型类的构造函数的形式类型参数T 的类型String

【讨论】:

    【解决方案2】:

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

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

    在 Java SE 6 中,它必须以这种方式完成:

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

    More details...

    【讨论】:

      【解决方案3】:

      因为它是 JDK 1.7(Diamond 运算符)的增强,在您必须在类和构造函数 HashMap&lt;String, String&gt; hashMap = new HashMap&lt;String, String&gt;(); 上指定泛型类型之前

      【讨论】:

        【解决方案4】:

        它使用的是 1.7 中引入的diamond operator

        【讨论】:

          【解决方案5】:

          您不能使用在 JDK 1.7 For JDK 1.6 中使用的相同语法

          【讨论】:

            猜你喜欢
            • 2013-09-19
            • 2014-01-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多