Groovy 中的基本运算符重载

Posted

技术标签:

【中文标题】Groovy 中的基本运算符重载【英文标题】:elementary operator overloading in Groovy 【发布时间】:2017-10-29 15:17:34 【问题描述】:

我是 Groovy 的新手,之前我只学过 C# 和 C++,所以我在习惯 Java 时遇到了一些问题,尤其是我们在项目中使用的 Groovy。所以这个问题涉及到 Groovy。

我正在尝试:

创建一个新类 X:
class X 
        double val

为 X 类的变量重载基本运算符(+、-、*、/、** 等)

问题是: - 在 Groovy 中,我可以重载类 X 的运算符,包括一个属性 - 值(即双精度)

X plus(X obj)
  X newobj = new X(this.val + obj.val)
  return newobj

X plus(double obj)
  X newobj = new X(this.val + obj)
  return newobj

但是,如果双重对象位于第一位(左侧),我该怎么办?喜欢:

double a X b X result = a + b // it will not work because operator + of a is not overloaded to provide addition of b

除了双重运算符,我是否需要重载类似的东西?:

ArrayList.metaClass.plus << Collection b -> 
    [delegate, b].transpose().collectx, y -> x+y

正如在 Overloading + operator for arrays in groovy

也许有办法将方法添加为访问元类的闭包?

不幸的是,数组示例是我在互联网上找到的最接近的答案。希望有办法!

【问题讨论】:

【参考方案1】:

是的,您可以将其重新定义为 Double:Double.metaClass.plus = ...

小心!在 groovy 中

def d0 = 2.1
println d0.getClass() //  java.math.BigDecimal

double d1 = 2.1
println d1.getClass() //  java.lang.Double

【讨论】:

感谢它的工作!我不知道的问题是一些语言限制。我们不是在纯 Groovy 上工作,而是在为 GPU 编程开发的那个上工作,所以我可以在 groovy 中运行它,但测试在 GPU 上不起作用。所以我需要定义哑函数而不是重载:)

以上是关于Groovy 中的基本运算符重载的主要内容,如果未能解决你的问题,请参考以下文章

Groovy集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )

Groovy05_Groovy方法调用与运算符重载

GroovyGroovy 运算符重载 ( 运算符重载 | 运算符重载对应方法 )

看懂Gradle脚本- Groovy语法之运算符重载

运算符重载

C++ | 运算符重载