为什么 Java 7 和 Eclipse 3.8 编译器无法使用新的 Java 7 钻石运算符编译 JDK 代码?

发布于 2024-11-29 13:32:46 字数 437 浏览 0 评论 0原文

import java.util.*;

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

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

错误是

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

这怎么行? Oracle 使用与我们相同的编译器。

import java.util.*;

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

asList() is taken from Oracles JDK implementation of java.util.Arrays.

The error is

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

How can this work? Oracle uses the same compiler that we do.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

有木有妳兜一样 2024-12-06 13:32:46

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

特别是,此类有一个以 T[] 作为参数的构造函数,而 java.util.ArrayList 没有。

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

Attention: The ArrayList used in the java.util.Arrays class is not java.util.ArrayList, but a nested class java.util.Arrays.ArrayList.

In particular, this class has an constructor which takes a T[] as argument, which java.util.ArrayList does not have.

Copy this class, too, and it will work.

秋日私语 2024-12-06 13:32:46

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

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

Eclipse 将毫无问题地推断 ArrayList<>( a ) 的类型,并且会推断其类型为 Integer。我相信菱形运算符应该以这种方式进行操作:推断特定类型,而不是模板化类型。

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

      return new ArrayList<T>( a );

并且一切都会起作用:)。

From what I can gather, Eclipse wants to find a specific type to infer into the templated ArrayList. For example, if your method's signature was:

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

Eclipse would have no problem inferring the type of ArrayList<>( a ), and would infer that its type is Integer. I believe the diamond operator is meant to operate that way: to infer a specific type, not a templated one.

Fortunately, you have templated the entire method, so that you could form your statement thus:

      return new ArrayList<T>( a );

And everything would work :).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文