在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
ant和RAD的Java版本都是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) {}
Java不允许只使用不同的泛型参数进行重载。从运行时的角度来看,两者都只是将列表作为参数的方法。
我很惊讶RAD会这样做;这是不应该的。拥有如下的类是不合法的:
class Foo {
public void foo(List<A> as);
public void foo(List<B> bs);
}
因为,由于类型擦除,它们在运行时都具有完全相同的签名:
class Foo {
public void foo(List);
public void foo(List);
}
当你遇到这种问题时,这通常意味着你试图做一些比你实际需要的更复杂的事情:)在任何情况下,你都需要以某种方式消除这些歧义。
我认为唯一的解决方案是更改方法签名。目前,这两个方法的签名是相同的(即在运行时)。