“方法对于类型是不明确的”但类型不是模糊的(错误来自从Eclipse 3.7.2升级到eclipse 4.2)

我定义了:

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

我用它

 getArray( 1, 2 ) 

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

方法对于类型是不明确的

但正如你所看到的,这并不含糊。 我能做什么?

据报道这是eclipse bug 383780中的一个错误。
以下是修复程序的文档: https : //bugs.eclipse.org/bugs/attachment.cgi?id = 218320

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

 -DtolerateIllegalAmbiguousVarargsInvocation=true 

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

实际上这是不明确的,因为java中的Autoboxing允许你调用一个期望带有Integerint的方法,反之亦然,所以getArray( 1, 2 )实际上可以是对你的任何方法的有效调用。

据我了解你在做什么,你想要一个实用工具方法来创建任何数组。 也许你能做的最简单的事情就是将处理int的方法重命名为getIntArray() 。 或者只使用new int[] {1, 2} ,如果你想要一个int数组new int[] {1, 2}它是非常易读的。

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