使用List <>参数重载Java函数

Mad*_*urf 14 java arguments function list

我有2节课

public class Customer{
  ...
  public String getCustomerNumber();
  ...
}

public class Applicant{
   ....
   private Customer c;
   public Customer getCustomer(){ return c; }
   ...
}
Run Code Online (Sandbox Code Playgroud)

当提供客户或申请人列表时,我想要一个迭代列表并使用CustomerNumber执行某些操作的函数.

我试过重载该功能

public void processCustomerNumbers(List<Customer> custList)
...

public void processCustomerNumbers(List<Applicant> appList)
...
Run Code Online (Sandbox Code Playgroud)

但这些被视为重复的方法......有没有一种很好的方法来做到这一点,而不仅仅是有两个不同命名的函数?

fin*_*nnw 17

如果你让两个类都实现了一个通用的接口,

interface CustomerNumber {
    String getCustomerNumber();
}

public class Customer implements CustomerNumber {
  ...
  public String getCustomerNumber();
  ...
}

public class Applicant implements CustomerNumber {
   ....
   private Customer c;
   public Customer getCustomer() { return c; }
   public String getCustomerNumber() { return getCustomer().getCustomerNumber(); }
   ...
}
Run Code Online (Sandbox Code Playgroud)

那么你可以用一种方法做你想做的事:

public void processCustomerNumbers(List<? extends CustomerNumber> appList) {
    for (Customer c: appList) {
        processCustomerNumber(c.getCustomerNumber());
    }
}
Run Code Online (Sandbox Code Playgroud)


dan*_*ben 14

关于Java中泛型的事情是泛型类型在运行时被擦除,因此这两种方法都编译为相同的签名.您需要具有单独的方法名称,或在运行时检查列表元素的类型.

  • 是的,这就是使用类型擦除的原因 - 避免破坏与前泛型代码的向后兼容性. (3认同)
  • Java并不总是具有泛型; 添加它们时,生成的字节码没有改变. (2认同)

Ano*_*on. 6

泛型具有所谓的类型擦除 - List<Customer>并且List<Applicant>是相同的类型,编译器只是对你可以用它们做什么放置编译时限制.

您可以检查列表中第一个对象的类型,并根据该方法调用(命名不同的)内部方法.


Ste*_*n C 5

解决此问题的一种方法是定义自定义列表类型,如下所示:

class CustomerList extends ArrayList<Customer> {
    ...
}

class ApplicantList extends ArrayList<Applicant> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

那么以下重载将是合法的:

public void processCustomerNumbers(CustomerList custList)

public void processCustomerNumbers(ApplicantList appList)
Run Code Online (Sandbox Code Playgroud)

但是,我认为这不是一个好主意.首先,它将特定的实现类硬连接到应用程序的API中.

更好的方法是为Customer和Applicant定义一个通用接口,允许您使用一种processCustomerNumbers方法处理它们.(正如其他答案中详细描述的那样.)