带有泛型重载的 Java 删除(不是覆盖)

标签 java generics overloading type-erasure

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

下面的类(最底部)让我感到既模糊又温暖,因为它简洁明了并且很好地重用了现有代码。一个问题类型删除。

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

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

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

所以 eclipse 提示说:
方法 clawBack(Collection) 与类型 CommissionFacade 中的另一个方法具有相同的删除 clawBack(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);
        }
    }

}

最佳答案

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

对象中的代码将是:

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
    }

}

我更喜欢这种方法,因为我相信您的域应该包含您的逻辑;但我不完全了解您的确切愿望,所以我会把它留给您。

使用双重分派(dispatch),您可以将“ClawbackHandler”传递给 clawback 方法,并在处理程序上根据类型调用适当的方法。

关于带有泛型重载的 Java 删除(不是覆盖),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11535206/

相关文章:

java - Spring Jackson 数组而不是 List

java - 编译器根据什么标准选择重载方法之一

c++ - 带有括号运算符重载的可调整大小数组类的前两个元素中的垃圾值

swift - 如何调用更具体的重载方法

java - Xpath 从错误节点返回值

java - 如何在java中停止第3方方法?

java - 方法调用和通配符

java - Java 编译器如何对下界通配符执行类型删除?

java - 是否可以在jOOQ中不仅根据列名或数据类型,还根据表名设置自定义类型?

swift 2 自省(introspection)