在java类中,我有一个像这样的重载方法:
method1(List<Details1HO> input){};
和method1(List<Details2HO> input){};
Details2HO
和Details1HO
都扩展了同一个类DetailsHO
。
RAD构建了很好的类,但是ant给出了错误:
name clash: method1(java.util.List<Details1HO>) and method2(java.util.List<Details1HO>) have the same erasure
Java版本在ant和RAD中都是1.5
编辑:方法有不同的返回类型
编辑#2:真正的错误:
name clash: mapToDO(java.util.List<com.bmo.ctp.alerts.businessobjects.user.hibernate.DeliveryDomainRestrictionHO>) and mapToDO(java.util.List<com.bmo.ctp.alerts.businessobjects.subscription.hibernate.SubscriptionDetailsHO>) have the same erasure
真实声明:
public static DeliveryDomainRestrictionDO[] mapToDO(List<DeliveryDomainRestrictionHO> deliveryDomainRestrictions){}
public static List<SubscriptionSummaryDO> mapToDO(List<SubscriptionDetailsHO> input) {}
答案 0 :(得分:5)
Java不允许仅使用不同的通用参数进行重载。从运行时的角度来看,这两种方法都只是将列表作为参数。
答案 1 :(得分:1)
我很惊讶RAD会建立这个;它不应该。有一个看起来像这样的课程是不合法的:
class Foo {
public void foo(List<A> as);
public void foo(List<B> bs);
}
因为type erasure,它们在运行时都具有完全相同的签名:
class Foo {
public void foo(List);
public void foo(List);
}
当你遇到这类问题时,通常意味着你正在尝试做一些比实际需要更复杂的事情:)在任何情况下,你都需要以某种方式消除歧义。
答案 2 :(得分:0)
我认为唯一的解决方案是更改方法签名。目前,两种方法的签名都是相同的(AT运行时)。