【问题标题】:Ambiguous constructor due to type erasure由于类型擦除,构造函数不明确
【发布时间】:2014-08-07 11:55:23
【问题描述】:

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

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 个问题:

  1. 我知道使用原始类型是一种不当行为(openType 应该声明为OpenType&lt;?&gt;,而不是OpenType),但是 ctor 签名怎么会模棱两可?在第一种情况下,签名擦除是OpenMBeanParameterInfoSupport(String, String, OpenType, Descriptor),而在第二种情况下,OpenMBeanParameterInfoSupport(String, String, OpenType, Object),所以javac应该只选择最具体类型的签名(即Descriptor),不是吗?李>
  2. 我的同事声称他们可以使用任何 1.7 JDK 成功构建项目,指定 -source 1.6 -target 1.6,而我是唯一面临编译器错误的人。有没有办法编译代码而不改变它?我认为唯一的解决方法是将源级别设置为 1.4,这绝对不是我们的构建服务器使用的。

【问题讨论】:

  • 首先查看项目的库列表:您很可能同时拥有 JRE 6 和 JRE 7 库。 (使用 eclipse 时典型的 IDE 配置错误。)
  • @JoopEggen:不,我正在从命令行编译单个类,因此不太可能发生 rt 库冲突。

标签: java generics type-erasure erasure


【解决方案1】:
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.

确实如此,第二种方法可以自动解析为&lt;javax.management.Descriptor&gt;,而第一种方法也匹配,因为&lt;?&gt; 基本上是? extends Object,可以是任何东西,包括javax.management.Descriptor

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

【讨论】:

  • javac 不应该选择与签名匹配的第一个选项,而是选择具有 most specific 类型的方法(在我的情况下为Descriptor)。此外,我无法更改 ctor 签名:它由 JMX 规范指定。
  • 您是否尝试过使用不同的编译器,例如 Eclipse 的编译器?
  • 是的。 gcjecj 都产生类似的错误消息(“ctor is ambiguous”)。
猜你喜欢
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多