【Groovy】Groovy 运算符重载 ( 运算符重载 | 运算符重载对应方法 )

举报
韩曙亮 发表于 2022/01/10 22:21:29 2022/01/10
【摘要】 文章目录 一、运算符重载二、运算符重载对应方法三、完整代码示例 一、运算符重载 Groovy 类可以进行运算符重载 , 任何一个类都可以使用预定义的 运算符 进行运...





一、运算符重载



Groovy 类可以进行运算符重载 , 任何一个类都可以使用预定义的 运算符 进行运算 , 如 " + - * / " 加减乘除 操作 , Groovy 中支持 26 26 26 种运算符的重载操作 ;

如 : 定义一个 Age 类 , 该类代表年龄 , 为该类进行 " + " 运算符重载 ;

class Age {
    def ageNumber
    
    @Override
    String toString() {
        return "ageNumber : " + ageNumber
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

要实现 " + " 运算符重载 , 只需要在该类中定义 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
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23




二、运算符重载对应方法



运算符 对应的重载方法
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"

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

执行结果 :

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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/122294399

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。