繁体   English   中英

JDK7编译错误:歧义引用

[英]JDK7 Compilation Error: Ambiguity reference

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

对于create的引用是模糊的,Meta中的方法create(long,Object ...)和Meta匹配中的方法create(Object ...)

这里的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编译器中的修复引起的:

JDK 7和JDK 6之间的不兼容性

区域:工具

概要:大多数特定Varargs方法选择的变化

描述:当多个方法适用于给定的调用站点时,javac编译器中的重载决策算法已经修复了它如何选择最具体的varargs方法(参见JLS,Java SE 7 Edition,第15.12.2.5节) 。

...

虽然javac编译器接受的代码多于JDK 7之前的代码,但在以下情况下,此修补程序还会导致轻微的源代码不兼容:

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

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

此代码在JDK 6中编译(最具体的方法是foo(int ...))。 此代码不在JDK 7下编译。


要使代码在两个JDK中都能工作,您需要为编译器提供一个额外的提示来选择正确的方法,例如像

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

这将为JDK6和JDK7调用create(long id, Object... parameters) ,并将为varargs部分传递一个大小为0的数组,在Java 6的情况下也会传递原始代码。

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

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

长时间包裹在一个龙成为一个对象。

那么编译器如何知道调用哪个方法?

对于编译器,由于自动装箱,两种方法都匹配方法调用。

如果为编译器调用create(12) ,则无法确定方法。 因为当long被自动装入Long时,它将匹配这两种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM