Java 类型擦除导致构造函数不明确

Java 类型擦除导致构造函数不明确,java,generics,type-erasure,erasure,Java,Generics,Type Erasure,Erasure,我有一段遗留源代码,如下所示: import javax.management.MBeanParameterInfo; import javax.management.openmbean.OpenMBeanParameterInfoSupport; import javax.management.openmbean.OpenType; class C { void f() { final MBeanParameterInfo parameter = ...;

我有一段遗留源代码,如下所示:

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());
    }
}
代码中使用的
OpenMBeanParameterInfo-Support
构造函数在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());
                ^
对OpenMBeanParameterInfo支持的引用不明确,javax.management.openmbean.OpenMBeanParameterInfo支持中的方法OpenMBeanParameterInfo支持(java.lang.String、java.lang.String、javax.management.OpenBean.OpenType、javax.management.Descriptor)和方法OpenMBeanParameterInfo支持都不明确(java.lang.String、java.lang.String、javax.management.openmbean.OpenType、T)在javax.management.openmbean.OpenMBeanParameterInfo中匹配
新的OpenMBeanParameterInfo支持(“…”,“…”,openType,parameter.getDescriptor());
^
2个问题:

  • 我理解使用原始类型是一种不当行为(
    openType
    应该声明为
    openType
    ,而不是
    openType
    ),但是为什么ctor签名不明确?在第一种情况下,签名擦除是
    openbeanParameterInfo支持(字符串、字符串、openType、描述符)
    ,在第二个
    OpenMBeanParameterInfo支持(String,String,OpenType,Object)
    ,所以
    javac
    应该只选择最具体类型的签名(即
    描述符
    ),不是吗
  • 我的同事声称,他们可以使用任何1.7 JDK成功构建项目,指定
    -source 1.6-target 1.6
    ,而我是唯一一个面临编译器错误的人。有没有办法编译代码而不改变它?我听到的唯一解决办法是将源代码级别设置为1.4,这肯定不是我们构建服务器所使用的。
    两种方法
    OpenMBeanParameterInfo支持(
    java.lang.String,
    java.lang.String,
    javax.management.openmbean.OpenType,
    (javax.management.Descriptor)
    在javax.management.openmbean.OpenMBeanParameterInfo支持中
    方法
    OpenMBeanParameterInfo支持(
    java.lang.String,
    java.lang.String,
    javax.management.openmbean.OpenType,
    (T)
    在javax.management.openmbean.OpenMBeanParameterInfo支持中
    匹配。
    
    实际上,第二种方法可以自动解析为
    ,而第一种方法也可以匹配,因为
    基本上是
    ?扩展对象
    ,可以是任何东西,包括
    javax.management.Descriptor


    您需要以某种方式更改签名,以便在调用它们时它们无法匹配。即使只是在其中一个参数(例如带有OpenType的字符串)上切换顺序,也可以修复错误。

    首先查看项目的库列表:很可能您同时拥有JRE 6和JRE 7库。(使用eclipse时出现典型的IDE配置错误。)@JoopEggen:no,我正在从命令行编译一个类,因此rt库冲突不太可能发生。
    javac
    应该选择的不是匹配签名的第一个选项,而是最特定类型的方法(
    Descriptor
    )。此外,我无法更改ctor签名:它由JMX规范指定。您是否尝试使用其他编译器,如Eclipse的编译器?是的。gcj和ecj都会产生类似的错误消息(“ctor不明确”)。
    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.