当前位置: 首页 > 面试题库 >

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

郭俊人
2023-03-14
问题内容

我的域中有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);
        }
    }

}

问题答案:

重命名方法,或使用多态性:使用接口,然后将clawback代码放入对象本身,或使用两次分派(取决于您的设计范例和口味)。

使用对象中的代码将是:

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方法,并在处理程序上根据类型调用适当的方法。



 类似资料:
  • 问题内容: 假设我在课堂上说两种方法 和 那是什么感觉 重载还是重载? 问题答案: 重载是指两个或多个具有相同名称但参数不同的方法,就像您的示例一样。重载是从接口或抽象类实现一个方法的,因此超类中的方法具有实现,而子类中的方法具有不同的实现,它们仍然具有相同的方法名称和参数。

  • 问题内容: 嗨,我只是想确保我正确理解这些概念。Java中的重载意味着您​​可以拥有具有不同数量的参数或不同数据类型的构造函数或方法。即 这个方法怎么样?由于它返回不同的数据类型,是否仍会被视为重载? 第二个问题是:java中有什么重载?它与继承有关吗?让我们有以下内容: 所以现在让我说以下 如果我打电话 这将返回车辆类的价格20,000 如果我打电话 这将返回卡车级别的价格14,000 我的知识

  • 问题内容: 阅读:Joshua Bloch撰写的有效Java-第二版 第8项-在覆盖等于时遵守总合同: 程序员编写看起来像这样的equals方法,然后花很多时间迷惑它为什么不能正常工作的情况并不少见: [代码示例在这里] 问题在于此方法不会覆盖Object.equals,后者的参数类型为Object,而是将其重载。 代码样例: 我的问题: 为什么像此代码示例中那样重载的强类型equals方法不够用

  • 重载-同一类中具有不同签名的同一方法 如果我在父类中有一个重载方法,那么子类会重载或重写这个特定的方法吗?

  • 本文向大家介绍解析Java继承中方法的覆盖和重载,包括了解析Java继承中方法的覆盖和重载的使用技巧和注意事项,需要的朋友参考一下 方法的覆盖 在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称、返回值类型、参数列表。   如果在新类中定义一个方法,其名称、返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法。   参数列

  • 问题内容: 我有一个带有方法签名的Java函数 在我的抽象类中,我用方法覆盖了它 搭便车不起作用。这是矛盾之处吗?我认为自动装箱也适用于方法签名替代。 问题答案: 和是两种不同的类型。自动装箱模糊的程序员的方便的源代码级的区别,但不会改变的事实,他们事实上是两个 非常 不同的类型。 因此,你不能接受一个方法有一个接受一个反之亦然,副。 请注意,在声明采用而不是的方法之前,您可能应该三思而后行。这是