我定义了:
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中遇到了编译错误:
对于类型,方法不明确
但是你可以看到这并不含糊。我该怎么办?
答案 0 :(得分:24)
据报道这是日食bug 383780中的一个错误 以下是修复的文档: https://bugs.eclipse.org/bugs/attachment.cgi?id=218320
基本上,要修复编译器错误,请获取最新的eclipse版本(截至目前为4.2.1),在-vmargs
eclipse.ini
之后添加以下行:(那么您可能需要重启eclipse并重建你的项目)
-DtolerateIllegalAmbiguousVarargsInvocation=true
话虽如此,Samuel是正确的:方法调用是模糊的。上面的代码示例之前有效,因为在1.6之前JDK中有bug;并且eclipse中的自定义编译器成功地模仿了这个bug。在开发Juno时,他们通过将模糊调用报告为错误来修复this bug(因为JDK错误在1.7中得到修复),让许多人(包括我)烦恼。上面的修复程序要求您明确告诉eclipse“容忍非法的模糊Varargs调用”。
答案 1 :(得分:9)
实际上这是不明确的,因为java中的Autoboxing允许您调用期望带有int
的{{1}}的方法,反之亦然,因此Integer
实际上可以是对您的任何方法的有效调用。
据我了解你在做什么,你想要一个实用工具方法来创建一个无论什么的数组。也许您可以做的最简单的事情是将处理getArray( 1, 2 )
的方法重命名为int
。或者只使用getIntArray()
,如果你想要一个new int[] {1, 2}
数组,那就非常易读。
您可以在http://docs.oracle.com/javase/specs/jls/se5.0/jls3.pdf的语言规范中找到此信息(在您的情况下,确定调用的方法将转到第15.12.2节“编译时间”步骤2:确定中所述过程的第3步)方法签名,因为你使用arity变量,并且在步骤3,两个方法调用都是有效的)