“方法对于类型是模棱两可的”,但类型不是模棱两可的(错误来自从eclipse 3.7.2升级到eclipse 4.2)

2022-09-03 10:01:49

我定义了:

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

方法对于类型是不明确的

但正如你所看到的,这并不是模棱两可的。我该怎么办?


答案 1

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

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

-DtolerateIllegalAmbiguousVarargsInvocation=true

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


答案 2

实际上这是模棱两可的,因为Java中的自动装箱允许您调用一个期望带有a的方法,反之亦然,因此可以真正成为对任何方法的有效调用。intIntegergetArray( 1, 2 )

据我所知,你在做什么,你想要一个实用程序方法来创建一个数组。也许您可以做的最简单的事情就是将处理的方法重命名为 。或者如果你想要一个数组,就直接使用可读性很强的数组。intgetIntArray()new int[] {1, 2}int

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


推荐