[英]java automatic function calling
我有一个数学类,它存储n个数组列表中的表达式表示我目前有三个类AdditionArray MultipleArray和Variable它们都实现了我的Number接口。
public interface Number {
public Number Multiply(Number number);
在实现Number i的类中,已经重载了像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中, 重载是一种编译时多态,而重写是一种运行时多态。 请参阅Java中方法重写和方法重载之间的区别是什么? 。
这意味着编译器将始终在编译时确定要调用的两个重载方法中的哪一个,而不是被覆盖的方法(这是在子节点中定义的具有相同签名的方法作为祖先类),可以基于此方法动态调度这些方法。正在调用该方法的类的运行时类型。
我没有真正查看你的代码,只是为了回答你的主要问题--Java确实根据最近的类型确定在编译时要调用的内容。 如果它在运行时完成,它将是一种动态语言。
Java的速度非常快 - 但它在运行时没有考虑太多,因此速度很快。 它往往比Python快10倍,比Ruby快100倍。
如果你想在这方面有更多的灵活性,我建议你根本不使用Java的绑定,而是创建一个“Operation”对象并手动将它绑定到你的“Numbers”。 通过这种方式,您可以从对象中制作出非常酷的代数树。 如果没别的话它很有趣 - 我已经完成了几次。 它仍然会很快。
正如Bill K所说,Java在编译时确定了这一点,这是设计的。
实现这一点的真正标准方法是在重载方法中使用超类型来检查子类的类型,并使用强制转换委托或者根据需要抛出异常。
使用Generics是另一种选择,它可以提高你的类型安全性,但是我对你的代码知之甚少,不知道它是否会全面运作。 通用数字界面可能如下所示:
public interface Number<T extends Number> {
public T multiply(Number<? extends T> number);
}
泛型可能会在边缘变得奇怪,因此放弃类型安全性并检查参数类型可能是值得的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.