我有一段遗留源代码,如下所示:
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,这绝对不是我们的构建服务器使用的。