Java擦除与通用重载(不覆盖)

前端之家收集整理的这篇文章主要介绍了Java擦除与通用重载(不覆盖)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的域中有FinanceRequests和CommisionTransactions.
如果我有一个FinanceRequests的列表,每个FinanceRequest可能包含需要被抓回的多个CommisionTransactions.不要担心这是如何完成的.

下面的课程(非常低)使我感觉到自己的succint感到所有模糊和温暖,并重用现有的代码很好.一个问题类型擦除.

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

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

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

所以eclipse抱怨说:
方法hookBack(Collection)与CommissionFacade类型中的另一种方法具有相同的擦除爪子(Collection)

有什么建议来重组这样一来,它仍然是一个优雅的解决方案,使代码重用得很好?

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

}

解决方法

重命名方法,或使用多态:使用一个接口,然后将回拨代码放在对象本身中,或者使用双重分派(取决于您的设计范例和品味).

使用对象中的代码

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”传递给回拨方法,并根据类型在处理程序中调用适当的方法.

猜你在找的Java相关文章