Groovy支持运算符重载,各种运算符被映射到普通的java对象的方法调用,这就使得开发者可以利用运算符重载的优势来编写自己的Java或者groovy对象。
下面的表格描述了groovy中的操作符所映射到的方法:
Operator | Method |
a + b | a.plus(b) |
a – b | a.minus(b) |
a * b | a.multiply(b) |
a ** b | a.power(b) |
a / b | a.div(b) |
a % b | a.mod(b) |
a | b | a.or(b) |
a & b | a.and(b) |
a ^ b | a.xor(b) |
a++ or ++a | a.next() |
a– or –a | a.previous() |
a[b] | a.getAt(b) |
a[b] = c | a.putAt(b, c) |
a << b | a.leftShift(b) |
a >> b | a.rightShift(b) |
switch(a) { case(b) : } | b.isCase(a) |
~a | a.bitwiseNegate() |
-a | a.negative() |
+a | a.positive() |
另外需要注意的是下面的所有的操作符,在遇到null的时候,都不会抛出java.lang.NullPointerException
Operator | Method |
a == b | a.equals(b) or a.compareTo(b) == 0 ** |
a != b | ! a.equals(b) |
a <=> b | a.compareTo(b) |
a > b | a.compareTo(b) > 0 |
a >= b | a.compareTo(b) >= 0 |
a < b | a.compareTo(b) < 0 |
a <= b | a.compareTo(b) <= 0 |
需要注意的是,“==”操作符并不总是和equals()方法等价。
比如:
1 | def a = null |
2 | def b = "foo" |
3 |
4 | assert a != b |
5 | assert b != a |
6 | assert a == null |
无论a或者b谁是null,都不会抛出java.lang.NullPointerException。
另外在不同类型的对象之间比较的时候,强制类型转换规则使用于把数字类型转换为最大的数字类型。所以下面的代码是有效的:
1 | Byte a = 12 |
2 | Double b = 10 |
3 |
4 | assert a instanceof Byte |
5 | assert b instanceof Double |
6 |
7 | assert a > b |