钻石运算符的默认行为是什么

时间:2015-01-14 03:23:28

标签: java diamond-operator

我记得看过如下声明:

private static Logger log = Logger.getLogger(<>.class);

优点是它可以从一个类粘贴到另一个类而不会意外地成为另一个类的记录器。

现在,我无法进行编译,语法必定是错误的。那究竟是什么&lt;&gt;解析为自己(不是ArrayList&lt;&gt;()等)?

谢谢

更新

我断言合法语法来自:

  1. 我在网上看到它是一个合法而又漂亮的技巧。
  2. 我和同事都用Java 7将它粘贴到IntelliJ中并且编译正确。
  3. 那就是说,我找不到能让我再次访问该页面的搜索,而现在我无法进行编译!所以我希望有编译器或Java规范知识的人可以明确地说出它是否有效以及默认值是什么。

1 个答案:

答案 0 :(得分:3)

回到Java 5和6,当你必须声明泛型类*的新实例时,你必须使用以下语法。

List<String> myList = new ArrayList<String>();

仿制药的申报时间没有类型推断。

随着Java 7的出现,编译器学习了一两个关于类型推断的技巧。

如果编译器可以推断它,那么在调用它时使用菱形运算符<>将在Java 7中产生与上面代码相​​同的结果:

List<String> myList = new ArrayList<>();

当然,有些情况不可能发生。这是从上面的链接示例借来的。

List<String> list = new ArrayList<>();
list.add("A");
// The following statement should fail since addAll expects
// Collection<? extends String>

list.addAll(new ArrayList<>());

你在这里得到的是无效代码:

private static Logger log = Logger.getLogger(<>.class);

您实际上需要将具体的Class传递给该方法,并且Java无法在该上下文中为您推断它。

*:我不记得它是否与泛型方法一样糟糕,但我当天没有对Java 6做过大量的开发。