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

2022-09-03 03:38:35

我有2节课

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

public class Applicant{
   ....
   private Customer c;
   public Customer getCustomer(){ return c; }
   ...
}

当看到客户或申请人列表时,我想要一个函数来迭代列表并对客户编号执行某些操作。

我尝试过重载函数

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

public void processCustomerNumbers(List<Applicant> appList)
...

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


答案 1

如果使这两个类都实现一个公共接口,

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(); }
   ...
}

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

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

答案 2

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