【问题标题】:elementary operator overloading in GroovyGroovy 中的基本运算符重载
【发布时间】: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().collect{x, y -> x+y}
}

正如在 Overloading + operator for arrays in groovy

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

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

【问题讨论】:

    标签: java groovy operator-overloading metaclass


    【解决方案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 上不起作用。所以我需要定义哑函数而不是重载:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2019-11-17
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多