Groovy中的基本运算符重载

时间:2017-05-29 10:34:04

标签: java groovy operator-overloading metaclass

我是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

也许有办法添加一个方法作为闭包访问元类?

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

1 个答案:

答案 0 :(得分:0)

是的,您可以将其重新定义为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