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
应该只选择最具体类型的签名(即描述符
),不是吗-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.