我有一个数学类,它在 n 数组列表中存储表达式的表示 我目前有三个类 AdditionArray MultipleArray 和 Variable 它们都实现了我的 Number 接口(interface)。
public interface Number {
public Number Multiply(Number number);
在实现 Number 的类中,我有重载操作,例如 Multiply
public class MultipleArray extends ArrayList<Number> implements Number{
public Number Multiply(AdditionArray number);
public Number Multiply(Number number){throw new Exception("woops");}
问题是 java 不会在运行时自动调用正确的重载函数。似乎要在编译时弄清楚
例如
Number someNumber = new MultipleArray();
Number someOtherNumber = new AdditonArray();
MultipleArray result2 = someNumber.Multiply(someOtherNumber); //calls the correct function
Number result2 = someNumber.Multiply(someOtherNumber); // throws the woops exception
java为什么要这样做。还有另一种方法可以实现吗?例如某种工厂?
干杯, 标记
最佳答案
在 Java 中,重载 是一种编译时多态性,而覆盖 是一种运行时多态性。参见 What is the difference between method overriding and method overloading in Java? .
这意味着编译器将始终在编译时确定调用两个重载方法中的哪一个,而不是可以动态分派(dispatch)到基于调用该方法的类的运行时类型。
关于java自动函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2231586/