我有一段原始源代码,看起来像这样:

import javax.management.MBeanParameterInfo;
import javax.management.openmbean.OpenMBeanParameterInfoSupport;
import javax.management.openmbean.OpenType;

class C {
    void f() {
        final MBeanParameterInfo parameter = ...;
        final OpenType openType = ...;
        new OpenMBeanParameterInfoSupport("...", "...", openType, parameter.getDescriptor());
    }
}


代码中使用的OpenMBeanParameterInfoSupport构造函数是在1.6中引入的。每当使用任何1.6+ javac编译代码时,我都会收到以下错误消息:

reference to OpenMBeanParameterInfoSupport is ambiguous, both method OpenMBeanParameterInfoSupport(java.lang.String,java.lang.String,javax.management.openmbean.OpenType<?>,javax.management.Descriptor) in javax.management.openmbean.OpenMBeanParameterInfoSupport and method <T>OpenMBeanParameterInfoSupport(java.lang.String,java.lang.String,javax.management.openmbean.OpenType<T>,T) in javax.management.openmbean.OpenMBeanParameterInfoSupport match
                new OpenMBeanParameterInfoSupport("...", "...", openType, parameter.getDescriptor());
                ^


2个问题:


我知道使用原始类型是一种不当行为(openType应该声明为OpenType<?>,而不是OpenType),但是ctor签名怎么会模棱两可?在第一种情况下,签名擦除为OpenMBeanParameterInfoSupport(String, String, OpenType, Descriptor),在第二种情况下为OpenMBeanParameterInfoSupport(String, String, OpenType, Object),因此javac应该只选择具有最特定类型(即Descriptor)的签名,不是吗?
我的同事声称他们可以使用任何1.7 JDK(指定-source 1.6 -target 1.6)成功构建项目,而我是唯一一个遇到编译器错误的人。有什么方法可以编译代码而无需更改代码?我听到的唯一解决方法是将源级别设置为1.4,这绝对不是我们的构建服务器使用的级别。

最佳答案

both method
OpenMBeanParameterInfoSupport(
                      java.lang.String,
                      java.lang.String,
                      javax.management.openmbean.OpenType<?>,
                      javax.management.Descriptor)
  in javax.management.openmbean.OpenMBeanParameterInfoSupport
and method
<T> OpenMBeanParameterInfoSupport(
                      java.lang.String,
                      java.lang.String,
                      javax.management.openmbean.OpenType<T>,
                      T)
  in javax.management.openmbean.OpenMBeanParameterInfoSupport
match.


的确如此,第二种方法可以自动解析为<javax.management.Descriptor>,而第一种方法也可以匹配,因为<?>基本上是? extends Object,可以是任何包含javax.management.Descriptor的东西。

您需要以某种方式更改签名,以便在调用它们时不匹配它们。即使只是在参数之一(例如带有OpenType的String)上切换顺序也可以解决该错误。

关于java - 类型删除导致构造函数不明确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25181869/

10-11 04:34