如何消除对Arrays.copyof()的模糊调用?

14
我在我的安卓手机上运行AIDE,并且在编译以下Java代码时遇到了问题:
`elements = Arrays.copyOf(elements, elements.length * 2);`
这里的`elements`是`int[]`类型。我从AIDE得到的错误信息是:
`Several methods are applicable to (int[], int): 'java.util.Arrays.copyOf(int[], int)' and 'java.util.Arrays.copyOf(T[], int)'`
我本以为编译器会选择前者,但实际上并没有。我该如何解决这个问题?

4
好问题,因为T不能是int类型。 - Peter Lawrey
听起来像是编译器/IDE的问题,因为只有一个有效的重载可以使用(第一个)。此外:Eclipse可以轻松编译这一行并且知道要调用哪一个。 - Joachim Sauer
如果在Eclipse中可以工作,那么肯定是编译器的问题。不过,有人知道如何诱导编译器选择一个吗? - Hannesh
不太清楚,为什么你不使用 ArrayList 呢?它可以自动处理大小调整。 - David Webb
@Dave,因为ArrayList将每个值都封装起来,这会带来相当大的开销。 - Hannesh
显示剩余3条评论
1个回答

1
这是一个编译器/IDE问题。然而,Arrays.copyOf是一个相当简单的函数,如果无法通过IDE/编译器更新解决问题,那么只需编写自己的版本即可。另一种方法是使用反射来调用它。但这会带来一些运行时开销,并且使代码看起来很奇怪,因此建议实现自己的版本。
以下是代码:
public static int[] copyOf(int[] original, int newLength) {
    int[] copy = new int[newLength];
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}

当然,如果您对 System.arraycopy 也遇到了同样的问题,那么这种方法就不适用了。可以尝试一下,如果不行,可以将其放在一个帮助类中,并使用一个非有缺陷的编译器来编译这个帮助类。


@JoachimSauer:不是这样的。Arrays.copyOf是一个普通的Java函数,它只是创建一个新数组并调用System.arrayCopy。我已经将其源代码添加到答案中了。 - gexicide
确实,我把它和System.arraycopy混淆了。 - Joachim Sauer
是的,这一定是编译器的问题。我会提交一个错误报告。 - Hannesh

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