15

我已经定义:

public static int[] getArray( final int... params ) {
    return params;
}
public static <T> T[] getArray( final T... params ) {
    return params;
}

我用这个

getArray( 1, 2 )

现在我在 eclipse 4.2 中得到编译错误:

方法对于类型不明确

但正如你所看到的,这并不模棱两可。我能做些什么?

4

2 回答 2

24

这被报告为 eclipse错误 383780中的错误。
这是修复的文档: https ://bugs.eclipse.org/bugs/attachment.cgi?id=218320

基本上,要修复编译器错误,请获取最新的 eclipse 版本(截至目前为4.2.1-vmargs ),在in之后添加以下行eclipse.ini:(然后您可能需要重新启动 eclipse 并重建您的项目)

-DtolerateIllegalAmbiguousVarargsInvocation=true

话虽如此,Samuel 是正确的:方法调用是模棱两可的。上面的代码示例之前可以工作,因为 JDK 1.6 之前存在错误;并且 eclipse 中的自定义编译器成功地模仿了这个错误。在开发 Juno 时,他们通过将模棱两可的调用报告为错误来修复了这个错误(因为 JDK 错误已在 1.7 中修复),这让很多人(包括我)感到恼火。上面的修复要求您明确告诉 eclipse “容忍非法的歧义可变参数调用”。

于 2012-11-13T00:44:35.540 回答
9

实际上这是模棱两可的,因为java 中的Autoboxing允许您调用一个期望 an 的方法,int反之亦然Integer,因此getArray( 1, 2 )实际上可以是对您的任何方法的有效调用。

据我了解您在做什么,您希望有一个实用方法来创建一个数组。也许您可以做的最简单的事情是将处理的方法重命名intgetIntArray(). 或者如果你想要一个数组,就使用new int[] {1, 2}它非常易读。int

您可以在http://docs.oracle.com/javase/specs/jls/se5.0/jls3.pdf的语言规范中找到此信息(在您的情况下,确定调用的方法将转到第 3 步15.12.2 编译时步骤 2:确定方法签名中描述的过程,因为您使用了 arity 变量,并且在步骤 3 中,两个方法调用都是有效的)

于 2012-06-01T17:23:48.690 回答