ant中的Java类型擦除编译问题



在java类中,我有这样一个重载方法:

method1(List<Details1HO> input){};

method1(List<Details2HO> input){};Details2HODetails1HO都是对同一类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);
}

当你遇到这种问题时,这通常意味着你试图做一些比你实际需要的更复杂的事情:)在任何情况下,你都需要以某种方式消除这些歧义。

我认为唯一的解决方案是更改方法签名。目前,这两个方法的签名是相同的(即在运行时)。

相关内容

  • 没有找到相关文章

最新更新