【问题标题】:What is the default behavior of the diamond operator钻石算子的默认行为是什么
【发布时间】:2015-01-14 03:23:27
【问题描述】:

我记得看到过类似以下的声明:

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

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

现在,我无法编译,语法一定是错误的。那么 究竟是自己解决了什么问题(不是 ArrayList() 等)?

谢谢

更新:

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

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

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

【问题讨论】:

  • 什么都没有。它在语法上不正确。
  • 据我所知,<>.class 不合法,也从未合法。菱形运算符(在 Java 7 中引入)仅在您的上一个示例 (new ArrayList<>()) 中使用,以指示应该推断构造函数调用的泛型类型参数。 (没有菱形运算符表示构造了原始类型。)
  • 我认为某些 IDE 可能会隐藏具有该语法的类型,但它实际上仍然存在?

标签: java diamond-operator


【解决方案1】:

在 Java 5 和 6 中,当您必须声明一个泛型类的新实例*时,您必须使用以下语法。

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

在泛型声明时没有类型推断。

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

如果编译器可以推断它,那么在调用它时使用菱形运算符&lt;&gt; 将在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 进行大量开发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2010-11-04
    相关资源
    最近更新 更多