如何修改现有的Java类以使Groovy中的运算符重载?

时间:2010-09-14 17:32:06

标签: java groovy operator-overloading

我正在实现一些数学类,并且第一次发现Java(繁琐和重复的代码)问题,而切割器编码实际上无法克服这些问题。运算符重载非常方便,还有一些Groovy可以做得更好的事情(我也可以尝试Scala)。

所以我还在用Java编写主要类(现在是Complex和Matrix),但是我将从Groovy中使用它们。

我更改了某些方法(.add)的名称以利用运算符重载(.plus)。

现在,我的类与“Number”基类进行了很好的交互,所以我可以使用:

complex.add(number); //or 
complex = complex + number;

得到一个很棒的答案,但我不能使用:

complex = number + complex

因为数字不理解.add(数字),即使它确实如此,如果它变成一个复杂的数字,它也不会知道如何处理数字。

我可以写一个number.plus(复数)并将其添加到数字界面吗?代码实际上非常简单,我可以撤销它:

Number plus(complex) {
     return complex.plus(this);
}

这适用于类型号的所有内容,但我不知道Groovy是否可以在事后将其移植到数字接口。 (另外,Number和Complex都是Java,所以我认为这是groovy的一个加载项。)

还有其他建议吗?我应该放弃并学习Scala吗?

哦,我意识到可能有一些包可以做到这一点,但部分原因只是学习数学,我正在研究量子计算文本,并且正在实施练习。

1 个答案:

答案 0 :(得分:2)

您可以将所需方法作为闭包添加到Number元类。

例如(利用加法的交换性):

Number.metaClass.plus << { Complex complex ->
    complex.plus(delegate)
}

在此之后,任何Number子类也可以在等式的左侧。确保使用追加运算符<<以避免破坏其他重载加上元方法。数字被引用为delegate而不是this,因为它是一个闭包。