【问题标题】:Why can't the Java 7 and Eclipse 3.8 compiler compile JDK code with the new Java 7 diamond operator?为什么 Java 7 和 Eclipse 3.8 编译器不能使用新的 Java 7 菱形运算符编译 JDK 代码?
【发布时间】:2011-08-16 12:54:04
【问题描述】:
import java.util.*;

public class SimpleArrays
{
  @SafeVarargs
  public static <T> List<T> asList( T... a )
  {
    return new ArrayList<>( a );
  }
}

asList() 取自 java.util.Arrays 的 Oracles JDK 实现。

错误是

error: cannot infer type arguments for ArrayList<>
    return new ArrayList<>( a );
1 error

这如何工作? Oracle 使用与我们相同的编译器。

【问题讨论】:

  • 你用javac编译过这个吗?请显示你的编译命令和javac -version的输出。
  • 我在 NetBeans 中遇到了同样的错误。但是,如果我用 javac 手动尝试,它确实可以编译。
  • 经验法则是:如果你认为用三行代码在 java 中发现了一个 bug,那么你可能做错了 :)

标签: java generics java-7 diamond-operator


【解决方案1】:

注意:java.util.Arrays类中使用的ArrayList不是java.util.ArrayList,而是一个嵌套类java.util.Arrays.ArrayList

特别是,这个类有一个构造函数,它接受T[] 作为参数,而java.util.ArrayList 没有。

也复制这个类,它会起作用。

【讨论】:

  • 我仍然想知道他们为什么为数组包装器选择了如此令人困惑的名称。
【解决方案2】:

据我所知,Eclipse 希望找到一种特定类型来推断模板化的ArrayList。例如,如果您的方法的签名是:

public static List<Integer> asList( Integer... a )

Eclipse 可以毫无问题地推断出ArrayList&lt;&gt;( a ) 的类型,并且会推断出它的类型是Integer。我相信菱形操作符就是这样操作的:推断一个特定的类型,而不是一个模板化的类型。

幸运的是,您已经对整个方法进行了模板化,因此您可以这样形成语句:

      return new ArrayList<T>( a );

一切都会奏效:)。

【讨论】:

  • 请仔细阅读:“这如何工作?Oracle 使用与我们相同的编译器。”源代码来自 JDK,正如我所写的“取自 Oracles JDK implementation of java.util.Arrays”。
  • 对不起,这个答案不正确。 OP 中的代码完全合法。
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 2023-03-22
  • 2013-01-20
  • 1970-01-01
  • 2014-04-07
  • 2018-12-02
  • 2017-04-20
  • 2012-12-12
相关资源
最近更新 更多