0

我记得看到一个类似下面的声明:

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

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

现在,我无法编译它,语法一定是错误的。那么 <> 究竟是自己解析的(不是 ArrayList<>() 等)?

谢谢

更新:

我断言它是合法的语法来自:

  1. 我在网上看到它是一个合法而漂亮的把戏。
  2. 我和一位同事都使用 Java 7 将其粘贴到 IntelliJ 中,并且编译正确。

也就是说,我找不到可以让我再次访问该页面的搜索,而且我现在无法编译!所以我希望有编译器或 Java 规范知识的人可以明确地说它是否有效以及默认值是什么。

4

1 回答 1

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 进行大量开发。

于 2015-01-14T03:36:47.397 回答