java自动函数调用

java自动函数调用,java,Java,我有一个数学类,它在n数组列表中存储表达式的表示 我目前有三个类AdditionArray MultipleArray和Variable,它们都实现了我的数字接口 public interface Number { public Number Multiply(Number number); 在实现Number的类中,我有重载操作,例如Multiply public class MultipleArray extends ArrayList<Number> implement

我有一个数学类,它在n数组列表中存储表达式的表示 我目前有三个类AdditionArray MultipleArray和Variable,它们都实现了我的数字接口

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");}
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为什么要这样做。还有没有其他方法可以实现这一点。比如说某种工厂

干杯,
Mark

我并没有真正看您的代码,只是想回答您的主要问题——Java确实会根据最接近的类型确定在编译时调用什么。如果它在运行时这样做,它将是一种动态语言

Java的速度惊人地快,但是它在运行时没有考虑太多,所以速度很快。它往往比Python快10倍,比Ruby快100倍


如果您希望在这方面有更大的灵活性,我建议您根本不使用Java的绑定,而是创建一个“操作”对象并手动将其绑定到“数字”上。通过这种方式,您可以用对象创建一个非常酷的代数树。如果没有别的,那很有趣——我已经做过几次了。它仍然会非常快。

我并没有真正查看您的代码,只是为了回答您的主要问题——Java确实会根据最接近的类型确定在编译时调用什么。如果它在运行时这样做,它将是一种动态语言

Java的速度惊人地快,但是它在运行时没有考虑太多,所以速度很快。它往往比Python快10倍,比Ruby快100倍

如果您希望在这方面有更大的灵活性,我建议您根本不使用Java的绑定,而是创建一个“操作”对象并手动将其绑定到“数字”上。通过这种方式,您可以用对象创建一个非常酷的代数树。如果没有别的,那很有趣——我已经做过几次了。在Java中,重载是一种编译时多态性,而重写是一种运行时多态性。看

这意味着编译器将始终在编译时决定调用两个重载方法中的哪一个,而不是重写方法(这些方法在子类中定义的签名与祖先类相同)可以根据调用方法的类的运行时类型将其动态调度到。

在Java中,重载是编译时多态性的一种,而重写是运行时多态性的一种。看


这意味着编译器将始终在编译时决定调用两个重载方法中的哪一个,而不是重写方法(这些方法在子类中定义的签名与祖先类相同)可以根据调用该方法的类的运行时类型将其动态调度到。

正如Bill K所说,Java在编译时确定这一点,这是通过设计实现的

实现这一点的真正标准方法是在重载方法中包含超类型的代码,该超类型检查子类的类型,并使用强制转换委托,或者根据需要抛出异常

使用泛型是另一种选择,它将提高您的类型安全性,但我对您的代码了解不够,无法确定它是否能在所有方面都起作用。通用数字接口可能如下所示:

 public interface Number<T extends Number> {
       public T multiply(Number<? extends T> number);
 }
公共接口号{

公共T乘法(数字正如Bill K所说,Java在编译时决定这一点,这是通过设计实现的

实现这一点的真正标准方法是在重载方法中包含超类型的代码,该超类型检查子类的类型,并使用强制转换委托,或者根据需要抛出异常

使用泛型是另一种选择,它将提高您的类型安全性,但我对您的代码了解不够,无法确定它是否能在所有方面都起作用。泛型数字接口可能如下所示:

 public interface Number<T extends Number> {
       public T multiply(Number<? extends T> number);
 }
公共接口号{

公共部门不能倍增(数字只是一个实用的建议:按照惯例,方法以小写字母开头,类以大写字母开头。极大地提高了可读性。我同意,但有一个原因…保持一致。我知道我将使用列表。我将无法实现添加到列表和添加数学函数只是一个实用的建议:按照惯例,方法以小写字母开始,类以大写字母开始。极大地提高了可读性。我同意,但有一个原因…保持一致性。我知道我将使用列表。我将无法实现添加到列表和添加数学函数泛型听起来是一个很好的方法!这样java将调用重写的方法d并按照java的设计方式工作。我对吗?@Mark,简言之,是的,根据您需要的复杂程度,可能会有一些问题。泛型听起来是一个很好的方法!这样java将调用重写方法并按照java的设计方式工作。我对吗?@Mark,简言之,是的,可能会有一些问题你说的是一个运算工厂,它知道所有类型的数字,所以你可以做一些类似运算。乘法(multiplyArray,additionArray)->AdditionArrayon无论如何,我认为您必须检查值的类型,并根据类型分支到不同的操作。仔细研究一下。我认为如果您将乘法作为自己的一个类,或者是一个静态方法,您可能会发现使用起来更容易。您将每个操作数作为两种类型的数字之一传递(ScalarNumber或ArrayNumber?)然后检查类型以确定如何对其进行操作。将乘法作为数字类的成员实现似乎会有麻烦。因此,您所说的操作工厂了解所有类型的数字,因此您可以执行类似于Operation.multiply(multiplyArray,additionArray)的操作->不管怎样,我想你都会去的