我有一段遗留源代码,如下所示:
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
) ,不应该吗?-source 1.6 -target 1.6
,而我是唯一面临编译器错误的人。有没有办法编译代码而无需更改它?我听到的唯一解决方法是将源级别设置为1.4,这绝对不是我们的构建服务器使用的。答案 0 :(得分:0)
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)上切换顺序也可以修复错误。