java - 由于类型删除导致构造函数不明确

标签 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 = ...;
        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<?> ,而不是 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,这绝对不是我们的构建服务器使用的。

最佳答案

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 的字符串)也会修复错误。

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

相关文章:

c# - 使用泛型的脑残错误

java - 我们可以创建一个通用类数组吗?

java - 如何用 ' ' 声明 int?为什么 '2' == 50?

java - 在 Jframe 中使用 menuItem 切换 jpanels

c# - 泛型继承 c#

c# - 我怎样才能一般地包含仅限于某个类的实体的属性?

scala - 在 Scala 中重载通用事件处理程序

java - 获取与泛型类型实例化相对应的 Class 实例

java - Sun JDK 1.5 cannot dereference with generics 错误

java - 在 Spring Boot 中从 MongoDB 存储库中查找最大值和最小值