Java删除与generics重载(而不是覆盖)

我在我的域中有FinanceRequests和CommisionTransactions。 如果我有一个FinanceRequest列表,每个FinanceRequest可能包含多个CommisionTransactions需要被回收。 不要担心这是如何完成的。

下面的这个类(很底)让我感到所有模糊和温暖,因为它很好地恢复和重用现有的代码。 types擦除的一个问题。

public void clawBack(Collection<FinanceRequest> financeRequestList) public void clawBack(Collection<CommissionTrns> commissionTrnsList) 

擦除后它们都具有相同的签名,即:

 Collection<FinanceRequest> --> Collection<Object> Collection<CommissionTrns> --> Collection<Object> 

所以日食抱怨:
方法clawBack(Collection)具有与另一种方法相同的擦除clawBack(Collection)方法CommissionFacade

任何build议重组这个,使它仍然是一个优雅的解决scheme,使良好的代码重用?


 public class CommissionFacade { /********FINANCE REQUESTS****************/ public void clawBack(FinanceRequest financeRequest) { Collection<CommissionTrns> commTrnsList = financeRequest.getCommissionTrnsList(); this.clawBack(commTrnsList); } public void clawBack(Collection<FinanceRequest> financeRequestList) { for(FinanceRequest finReq : financeRequestList) { this.clawBack(finReq); } } /********COMMISSION TRANSACTIOS****************/ public void clawBack(CommissionTrns commissionTrns) { //Do clawback for single CommissionTrns } public void clawBack(Collection<CommissionTrns> commissionTrnsList) { for(CommissionTrns commTrn : commissionTrnsList) { this.clawBack(commTrn); } } } 

2 Solutions collect form web for “Java删除与generics重载(而不是覆盖)”

要么重命名方法,要么使用多态:使用接口,然后将callback代码放置在对象本身中,或使用双重调度(取决于您的devise范例和品味)。

在对象中的代码将是:

 public interface Clawbackable{ void clawBack() } public class CommissionFacade { public <T extends Clawbackable> void clawBack(Collection<T> objects) { for(T object: objects) { object.clawBack(); } } } public class CommissionTrns implements Clawbackable { public void clawback(){ // do clawback for commissions } } public class FinanceRequest implements Clawbackable { public void clawBack(){ // do clwaback for FinanceRequest } } 

我更喜欢这种方法,因为我相信你的领域应该包含你的逻辑; 但是我没有完全意识到你的确切愿望,所以我会把它留给你。

使用双重调度,您可以将“ClawbackHandler”传递给clawback方法,并根据types调用适当的方法。

我认为你最好的select是简单地命名方法。

 public void clawBackFinReqs(Collection<FinanceRequest> financeRequestList) { } public void clawBackComTrans(Collection<CommissionTrns> commissionTrnsList) { } 

事实上,这并不算糟糕,因为你没有得到任何额外的名字。

请记住,JVM 不会决定在运行时调用哪个方法。 与虚拟方法/方法相反,重载方法的重写parsing是在编译时完成的。 关于方法重载的Java教程甚至指出“重载的方法应该谨慎使用…”

  • Mockito:使用通用参数进行validation
  • 如何将string转换为任何types
  • 扩展通用类
  • 通用字典的大小写不敏感访问
  • List <Map <String,String >> vs List <? 扩展Map <String,String >>
  • 与Arrays.asList()不兼容的types
  • Java的generics:不能强制List <SubClass>列表<SuperClass>?
  • 为什么我不能使用float值作为模板参数?
  • SortedList和SortedDictionary有什么区别?
  • 用LINQselect一个字典<T1,T2>
  • 为什么Java枚举文字不能有genericstypes参数?