文章目录
一、运算符重载
Groovy 类可以进行运算符重载 , 任何一个类都可以使用预定义的 运算符 进行运算 , 如 " + - * / " 加减乘除 操作 , Groovy 中支持 26 26 26 种运算符的重载操作 ;
如 : 定义一个 Age 类 , 该类代表年龄 , 为该类进行 " + " 运算符重载 ;
class Age {
def ageNumber
@Override
String toString() {
return "ageNumber : " + ageNumber
}
}
要实现 " + " 运算符重载 , 只需要在该类中定义 plus 方法即可 , 既可以支持 与 Number 数字相加 , 又可以支持与 其它 Age 对象相加 ; 如果传入其它类型的参数 , 直接抛出异常 ;
class Age {
def ageNumber
def plus(age) {
// 传入的参数是 数字类型 , 如 int , float 等类型
if (age instanceof Number) {
// 处理 Age 对象与数字相加的情况
new Age(ageNumber: ageNumber + age)
} else if (age instanceof Age) {
// 处理 Age 对象与 Age 对象相加的情况
new Age(ageNumber: ageNumber + age.ageNumber)
} else {
// 如果 + 符号后面既不是数字 , 又不是 Age 对象
// 直接抛出异常
throw new MissingMethodException("plus", Age.class)
}
}
@Override
String toString() {
return "ageNumber : " + ageNumber
}
}
二、运算符重载对应方法
运算符 | 对应的重载方法 |
---|---|
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 & 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() |
a == b | a a.equals(b) or a.compareTo(b) == 0 ** |
a != b | a ! a.equals(b) |
a <=> b | a a.compareTo(b) |
a > b | a .compareTo(b) > 0 |
a >= b | a a.compareTo(b) >= 0 |
a < b | a a.compareTo(b) < 0 |
a <= b | a a.compareTo(b) <= 0 |
三、完整代码示例
完整代码示例 :
class Age {
def ageNumber
def plus(age) {
// 传入的参数是 数字类型 , 如 int , float 等类型
if (age instanceof Number) {
// 处理 Age 对象与数字相加的情况
new Age(ageNumber: ageNumber + age)
} else if (age instanceof Age) {
// 处理 Age 对象与 Age 对象相加的情况
new Age(ageNumber: ageNumber + age.ageNumber)
} else {
// 如果 + 符号后面既不是数字 , 又不是 Age 对象
// 直接抛出异常
throw new MissingMethodException("plus", Age.class)
}
}
@Override
String toString() {
return "ageNumber : " + ageNumber
}
}
// 创建两个 Age 对象
def age = new Age(ageNumber: 18)
def age2 = new Age(ageNumber: 18)
// Age 对象与 Number 类型数据相加
println age + 100
// Age 对象之间相加
println age + age2
// Age 对象与不支持的类型相加 , 会直接抛出异常
println age + "100"
执行结果 :
ageNumber : 118
ageNumber : 36
Caught: groovy.lang.MissingMethodException: No signature of method: Age.plus() is applicable for argument types: () values: []
Possible solutions: plus(java.lang.Object), use([Ljava.lang.Object;), split(groovy.lang.Closure), is(java.lang.Object), use(java.lang.Class, groovy.lang.Closure), use(java.util.List, groovy.lang.Closure)
groovy.lang.MissingMethodException: No signature of method: Age.plus() is applicable for argument types: () values: []
Possible solutions: plus(java.lang.Object), use([Ljava.lang.Object;), split(groovy.lang.Closure), is(java.lang.Object), use(java.lang.Class, groovy.lang.Closure), use(java.util.List, groovy.lang.Closure)
at Age.plus(Groovy.groovy:15)
at Age$plus.call(Unknown Source)
at Groovy.run(Groovy.groovy:30)