【问题标题】:How do I modify an existing Java class to overload an operator in Groovy?如何修改现有的 Java 类以重载 Groovy 中的运算符?
【发布时间】:2010-09-14 17:32:05
【问题描述】:

我正在实现一些数学课程,并且第一次发现了 Java 中的问题(繁琐且重复的代码),而这些问题我真的无法通过 Cleaver 编码来解决。运算符重载会非常方便,而且 Groovy 还可以做得更好(我也可能会在某个时候尝试 Scala)。

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

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

现在,我的类与“Number”基类的交互非常好,所以我可以使用:

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

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

complex = number + complex

由于 number 不理解 .add(Number),即使它理解了,如果它被证明是一个复杂的数字,它也不知道如何处理。

我可以写一个number.plus(complex)并添加到number界面吗?代码实际上很简单,我可以把它倒过来:

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

这适用于所有 number 类型的东西,但我不知道 Groovy 是否可以在事后将其移植到 number 接口。 (另外,Number 和 Complex 在 Java 中,所以我把它看作是 groovy 的插件)。

还有什么建议吗?我应该放弃并学习 Scala 吗?

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

【问题讨论】:

    标签: java groovy operator-overloading


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 那行得通,太棒了。我需要一些时间来理解它——但它让我知道从哪里开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    相关资源
    最近更新 更多