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

时间:2012-06-01 15:14:38

标签: java eclipse compiler-construction

我定义了:

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中遇到了编译错误:

  对于类型

方法不明确

但是你可以看到这并不含糊。我该怎么办?

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,两个方法调用都是有效的)