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中泛型的事情是泛型类型在运行时被擦除,因此这两种方法都编译为相同的签名.您需要具有单独的方法名称,或在运行时检查列表元素的类型.
泛型具有所谓的类型擦除 - List<Customer>并且List<Applicant>是相同的类型,编译器只是对你可以用它们做什么放置编译时限制.
您可以检查列表中第一个对象的类型,并根据该方法调用(命名不同的)内部方法.
解决此问题的一种方法是定义自定义列表类型,如下所示:
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方法处理它们.(正如其他答案中详细描述的那样.)