蚂蚁中的Java类型擦除编译问题

时间:2011-10-28 19:37:45

标签: java ant

在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

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) {}

3 个答案:

答案 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运行时)。

相关问题