gpt4 book ai didi

java - JDK7编译错误: Ambiguity reference

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:36 24 4
gpt4 key购买 nike

我正在尝试将遗留代码库从 java1.6 迁移到 1.7,但在编译时出现以下错误:

reference to create is ambiguous, both method create(long,Object...) in Meta and method create(Object...) in Meta match

这里的 Meta 是类名。只有在使用 JDK1.7 编译时才会出现此错误。在 1.6 中,它构建良好,所有依赖项也都运行良好。

两个多态函数如下:

 create(long id, Object... paramters) {
....
}

create(Object... paramters) {
....
}

如何解决这个问题,以便代码适用于 1.6 编译和 1.7 编译。

编辑:添加抛出错误的调用示例:

Id.create(1234);
Id.create(id); // id is a long value

最佳答案

这是由 Java 7 编译器中的修复引起的:

Incompatibilities between JDK 7 and JDK 6

Area: Tools

Synopsis: Changes in Most Specific Varargs Method Selection

Description: The overload resolution algorithm in the javac compiler has been fixed in how it selects the most specific varargs method when more than one method is applicable to a given call-site (see the JLS, Java SE 7 Edition, section 15.12.2.5).

...

While the javac compiler accepts more code than it did prior to JDK 7, this fix also results in a slight source incompatibility in the following case:

class Test {
void foo(int... i) {}
void foo(Object... o) {}

void test() {
foo(1,2,3);
}
}

This code compiles in JDK 6 (the most specific method is foo(int...)). This code does not compile under JDK 7.


为了让代码在两个 JDK 中都工作,你需要给编译器一个额外的提示来选择合适的方法,例如像

Id.create(1234, new Object[0]);
Id.create(id, new Object[0]);

这将为 JDK6 和 JDK7 调用 create(long id, Object... parameters),并将为可变参数部分传递大小为 0 的数组,如果带有原始代码的 Java 6。

尽管如此,这看起来有点奇怪,我可能会选择(为了更好的可读性)重命名其中一个方法,以便方法调用不依赖于签名。

您还应该考虑到 Java6 已处于生命周期结束阶段,因此另一种选择可能是修改代码,以便首先可以使用 Java7 进行编译。

关于java - JDK7编译错误: Ambiguity reference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15830541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com