在Java7的钻石上,需要澄清

时间:2012-10-12 15:36:41

标签: java

  

可能重复:
  Double brace initialisation (anonymous inner class) with diamond operator

使用Java 7,为什么以下是一个问题

final List<String> a = new ArrayList<>() {
    {
        add("word");
    }
};

需要显式类型声明,如

final List<String> a = new ArrayList<String>() {
    {
        add("word");
    }
};

2 个答案:

答案 0 :(得分:4)

恕我直言,一般来说,Java避免了类型推断。

在任何情况下,<>仅在编译器不需要知道使用哪种泛型类型时才有效。对于匿名类,需要提供实际类型,因为编译器不会推断类型。

有效<>关闭类型检查,而不是提供类型推断。匿名类存储实际的泛型类型,因此您必须提供它。

List<String> a = new ArrayList<>()

非常像

@SuppressWarnings("unchecked")
List<String> a = new ArrayList()

但是对于匿名子类,编译器需要为它提供泛型类型。

答案 1 :(得分:2)

由于某些技术性原因,不支持使用Diamond for anonymous类

Compile error: "'<>' cannot be used with anonymous classes"