代码之家  ›  专栏  ›  技术社区  ›  MadMurf

用列表<>参数重载Java函数

  •  12
  • MadMurf  · 技术社区  · 14 年前

    我有两个班

    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)
    ...
    

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

    6 回复  |  直到 7 年前
        1
  •  17
  •   finnw    14 年前

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

    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
  •  13
  •   danben    14 年前

    Java中泛型的事情是泛型类型在运行时被擦除,所以这两种方法都编译为同一个签名。您需要有单独的方法名,或者在运行时检查列表元素的类型。

        3
  •  6
  •   Anon.    14 年前

    仿制药有我们所知道的 类型消除 - List<Customer> List<Applicant> 对于相同的类型,编译器只对您可以使用它们做什么设置编译时限制。

    您可以检查列表中第一个对象的类型,并基于该类型调用(名称不同的)内部方法。

        4
  •  5
  •   Stephen C    14 年前

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

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

    那么,以下过载是合法的:

    public void processCustomerNumbers(CustomerList custList)
    
    public void processCustomerNumbers(ApplicantList appList)
    

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

    更好的方法是为客户和申请人定义一个通用的接口,允许您使用一个接口来处理它们。 processCustomerNumbers 方法。(如其他答案所述。)

        5
  •  0
  •   Jacob    7 年前

    改用数组。

    public void processCustomerNumbers(Customer[] custList)
    ...
    
    public void processCustomerNumbers(Applicant[] appList)
    ...
    

    尝试使用列表调用这些方法时,请将列表转换为数组:

    List<Customer> customers;
    List<Applicant> applicants;
    ...
    processCustomerNumbers(customers.toArray(new Customer[]{});
    processCustomerNumbers(applicants.toArray(new Applicant[]{});
    
        6
  •  -1
  •   PassionatedDeveloper    14 年前

    在进入方法名之前,类层次结构有点混乱…

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

    为什么申请人和客户 不同的物体?你能告诉我 这些物体之间的关系?