【问题标题】:Does java support multiple dispatch? If not how is the below code working?java支持多分派吗?如果不是,下面的代码是如何工作的?
【发布时间】:2017-05-14 04:43:40
【问题描述】:

java 支持多分派吗?如果不是,下面的代码是如何工作的?

Account.java

public interface Account 
{
    public void calculateInterest();
}

SavingsAccount.java

public class SavingsAccount implements Account
{

}

LoanAccount.java

public class LoanAccount implements Account
{

}

InterestCalculation.java

public class InterestCalculation 
{
    public void getInterestRate(Account objAccount)
    {
        System.out.println("Interest Rate Calculation for Accounts");
    }

    public void getInterestRate(LoanAccount loanAccount)
    {
        System.out.println("Interest rate for Loan Account is 11.5%");
    }

    public void getInterestRate(SavingsAccount savingAccount)
    {
        System.out.println("Interest rate for Savings Account is 6.5%");
    }
}

CalculateInterest.java

public class CalculateInterest 
{
     public static void main(String[] args) 
     {
         InterestCalculation objIntCal = new InterestCalculation();
         objIntCal.getInterestRate(new LoanAccount());
         objIntCal.getInterestRate(new SavingsAccount());        
     }
}

输出

贷款账户利率为 11.5% 储蓄账户利率为 6.5%

【问题讨论】:

  • 这就是方法重载的工作原理。您的实际方法参数是特定的子类型,而不仅仅是Account。
  • 你是说方法重载和多重调度是一样的?
  • new LoanAccount() 和 new SavingsAccount() 都是在运行时创建的,那怎么会超载呢?
  • 尝试传递Account 类型的变量,(假设稍后在运行时您将使用具体的对象引用来实例化它)。在这种情况下,将调用与 Account 作为参数对应的方法。这是您拥有的简单方法重载。当编译器看到调用了相同的方法名称时,它会看到您传递给它的参数是什么,然后它决定哪个方法具有与这些参数匹配的参数。

标签: java polymorphism multiple-dispatch


【解决方案1】:

首先是一些术语

Overloading 是能够创建多个方法的 同名不同实现。

在 Java 中,这是根据参数的编译时类型执行的:使用带有 matching signature 的方法,与参数的值无关。

Overriding 允许子类或子类提供 已由其中之一提供的方法的特定实现 它的超类或父类。

在 Java 中,这是通过根据所引用对象的运行时(动态)类型确定要调用的方法来执行的。这是Java实现single dispatch的方式,它是not be confused with overloading。

Multiple dispatch 表示一个函数或方法可以 基于运行时(动态)类型动态调度,或者在 更一般的情况是一些其他属性,的一个以上 论据。

Java 是否支持多分派?

在 Java 中,没有直接支持多分派。

但是,您可以emulate multiple dispatch 使用多层单调度与重载相结合。

这段代码是如何工作的?

请注意,此代码首先需要您为 LoanAccount 和 SavingAccount 提供 calculateInterest() 的实现,即使它不会在您的 POC 的其余部分中使用。

在您的类 InterestCalculation 中,您拥有方法 getInterestRate() 的三个不同重载。它们每个都有不同的签名(例如参数类型)。所以 main() 将根据参数的声明类型(从构造函数推导出来)调用正确的方法。

您可以优化您对单一调度的使用并使InterestCalculation 更加通用(例如,您可以添加更多Account 的实现而无需更改它):

public interface Account 
{
    public void calculateInterest();
    public double getInterest(); 
    public String getType(); 
}
...
public class InterestCalculation 
{
    public void getInterestRate(Account objAccount)
    {
        System.out.print ("Interest Rate for "+objAccount.getType()+" is ");
        System.out.print (objAccount.getInterest());
        System.out.println (" %");
    }
}

Online demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多