"method is ambiguous for the type"但类型并不含糊,(这个错误是由于从eclipse 3.7.2升级到eclipse 4.2引起的)。

15

我已经定义:

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

而我在IT技术中使用这个

getArray( 1, 2 )

现在我在Eclipse 4.2中遇到了编译错误:

方法对于此类型来说是模糊的

但是正如您所看到的,这并不模糊。我该怎么办?


编译器可能正在尝试应用自动装箱,因此它无法选择任何您的方法。我不确定,但您可以尝试显式地转换参数:getArray((int) 1, (int) 2) - Alexander Pavlov
请标记适当的编程语言(Java?C#?)。 - Paul R
1
顺便说一下,JDK 1.7中的javac与eclipse 4.2兼容。 - Samuel Rossille
请参见此链接:https://dev59.com/hloV5IYBdhLWcg3wY976 - Kannan Thangadurai
2个回答

24
这在eclipse中被报告为一个漏洞 bug 383780.
这里是修复的文档:https://bugs.eclipse.org/bugs/attachment.cgi?id=218320

基本上,为了解决编译器错误,获取最新的eclipse版本(4.2.1),在eclipse.ini中的-vmargs后添加以下行:(然后您可能需要重新启动eclipse并重建项目)

-DtolerateIllegalAmbiguousVarargsInvocation=true

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


对于最新的Eclipse(4.14)和Java 8,它又无法工作了。 - Csaba Tenkes
这在使用open-jdk-8u242-b08和Eclipse 06/2022版本中对我不起作用。 - dkero
有人知道如何修复它吗? - dkero

9

实际上这不太确定,因为在Java中自动装箱允许您调用期望一个int的方法,而传入一个Integer或者反过来,所以getArray(1, 2)可能是对您的任何方法有效的调用。

就我理解您正在做的事情而言,您想要编写一个实用方法来创建任意类型的数组。也许您可以将处理int的方法重命名为getIntArray()。或者如果您想要一个int数组,只需使用new int[] {1, 2},非常易读。

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

我认为这不够清晰。 在升级到Eclipse 4.2之前(之前是Eclipse 3.7.2),我们使用JDK6编译级别进行构建的相同项目设置,并且在构建时没有出现错误。 自动装箱已经在以前的配置中使用过了。 为什么升级会带来这个问题? - leojkelav
@user1430985 我已经添加了一个链接到规范的参考文献,其中解释了这种行为。如果我相信规范的话,你的项目已经依赖于先前版本的 Eclipse 编译器中的一个 bug。 - Samuel Rossille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接