Groovy 重写compareTo

2024-01-05

我正在使用 Groovy 类别在 DSL 下工作,我需要覆盖/重载==操作员。然而却是已知问题 http://jira.codehaus.org/browse/GROOVY-3364,当类实现Comparable, Groovy 会调用compareTo()方法用于==操作员。我正在寻找一些解决方法(不是 AST 转换)以便==做我想做的事。

我有以下“玩具”情况:

class Base implements Comparable<Base>{
    int a, b

    Base(int a, int b) {
        this.a = a
        this.b = b
    }

    @Override
    int compareTo(Base o) {
        return a <=> o.a //compare only a
    }
}

class BaseCategory {
    static boolean equals(Base base, o) { //complete equals
        if (o == null)
            throw new NullPointerException()
        if (o.getClass() != base.getClass())
            return false
        return base.a == o.a && base.b == o.b
    }

    static int compareTo(Base base, o) { //compatible with equals
        int c = base.a <=> o.a;
        if (c != 0)
            return c
        return base.b <=> o.b;
    }
}

现在当我跑步时

use(BaseCategory) {
    Base a = new Base(1, 2)
    Base b = new Base(1, 3)
    println a == b
    println a <=> b
}

I got true and 0, 代替false and -1。有什么解决方法吗?


An old Groovy bug[1] https://jira.codehaus.org/browse/GROOVY-1765[2] http://jira.codehaus.org/browse/GROOVY-1888 to be fixed in 3.0. Does your use case permit encapsulation and delegation?

class Base implements Comparable<Base>{
    int a, b

    @Override int compareTo(Base o) {
        return a <=> o.a
    }
}

class BaseDelegate {
    @Delegate Base base

    boolean equals(o) {
        if (o == null)
            throw new NullPointerException()
        if (o.getClass() != base.getClass())
            return false
        return base.a == o.a && base.b == o.b
    }

    int compareTo(o) { 
        int c = base.a <=> o.a;
        if (c != 0)
            return c
        return base.b <=> o.b;
    }
}

和测试:

def a = new Base(a: 1, b: 2)
def b = new Base(a: 1, b: 3)

assert (a == b) == true
assert (a <=> b) == 0


def a1 = new BaseDelegate(base: a)
def b1 = new BaseDelegate(base: b)

assert (a1 == b1) == false
assert (a1 <=> b1) == -1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Groovy 重写compareTo 的相关文章

随机推荐

  • !!(x) 在 C(尤其是 Linux 内核)中意味着什么?

    我一直在阅读 Linux 内核 具体来说 2 6 11 我遇到了以下定义 define unlikely x builtin expect x 0 来自 linux 2 6 11 include linux compiler h 61lxr
  • 对于自定义容器类的成员,List.Sort() 与 List.OrderBy() 的实用程序

    我发现自己回顾了一些旧的 3 5 框架遗留代码 并发现了一些点 其中有一大堆列表和字典必须以同步方式更新 我已经确定 通过将这些融合到新的自定义类的自定义容器类中 我可以使这个过程变得更加易于使用和理解 然而 在某些方面 我开始担心通过特定
  • 使用 jquery + jsonp,Internet Explorer 不保存 ASP.NET sessionID

    所以我正在使用 Jquery 做一些相当简单的 JSONP 东西 总体结构 网站存在于域中A JavaScript 存在于域中B JSON 服务也存在于域中B 该站点调用 jsonp 调用 json 服务 net 的方法 在 net 中我设
  • Jetty Servlet 不运行——而是获取目录列表

    我正在尝试让在 Netbeans 中构建并运行的 servlet 在 jetty 服务器上运行 本地部署始终有效 但是在 Jetty 上部署会导致目录列表 而不是实际运行的 servlet 问题似乎出在上下文配置上 但我不知道我做错了什么
  • Jax-RS 未使用 @provider 注释注册资源

    我有一个使用 jersey api 在 weblogic 12c 中运行的休息应用程序 我有一个带有注释 provider 的http 请求过滤器类 但是 在部署应用程序时 过滤器类未向我在 ApplicationConfig 类中添加的其
  • 具有 Owin 身份验证的 Mono

    我有一个在 Mono 中运行的 Owin 应用程序 我正在尝试让身份验证在其上正常工作 我使用了以下信息这一页 https coding abel nu 2014 06 writing an owin authentication midd
  • 如何使用for循环matlab调用顺序变量? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一堆变量叫做length act
  • -O0、-O1 和 -g 有什么区别

    我想知道如何使用 O0 O1 和 g 在库中启用调试符号 有些建议使用 O0 来启用调试符号 有些建议使用 g 那么 g 和 O0 之间的实际区别是什么 01 和 O0 之间的区别是什么 哪个最好使用 O0是优化级别 0 无优化 与省略 O
  • 无法从“pyproj”导入名称“CRS”以使用 osmnx 库

    I have used a fresh anaconda install to download and install all the required modules for osnmx library but I got the fo
  • 我们什么时候使用ANTLR

    谁能指导我在 ASP Net C 项目中使用 ANTLR dll 的目的 我刚刚注意到antlr 运行时 Antlr3 运行时 Antlr3 实用程序某些项目中引用的程序集 如果能引用一些现实世界的例子或者任何指向网页的链接都会有用 那就太
  • 如何在文本区域更改时将“必需”属性添加到输入?

    我需要在文本区域 orderComments 中输入文本的情况下将 required 属性添加到 html select toDept 中 下面是我的代码 我缺少什么 我需要在更改事件或其他事件上运行 jquery 吗 document r
  • EJB企业应用程序不需要EJB接口

    我创建了一个 Java EE 应用程序并向 EJB 项目添加了一个无状态会话 bean EJB 项目是 web WAR 项目中的依赖项 我将在 EJB 项目中创建的 EJB 注入到我的一个 servlet 中 这工作正常 我能够在 Web
  • 我可以获取字符串形式的 saml-token 吗?

    我正在使用 spring security saml2 1 0 0 RELEASE 它运作良好 对我来说非常好 但新的要求提出了 我需要 saml token 作为字符串 我可以将 saml token 作为字符串获取吗 我在日志中找到 s
  • 在 Android Studio 2.3 上创建项目时出错

    我已将 Android Studio 从 2 2 升级到 2 3 当我创建带有导航活动的新 Android 项目时 出现两个错误 Error java util concurrent ExecutionException java lang
  • Java 9 的 Maven 编译问题

    尝试使用 JDK 9 0 1 编译 Maven 项目时 我遇到了这个堆栈跟踪 但没有太多解释 Exception in thread main java lang AssertionError at jdk compiler com sun
  • 使用 C# 为所有桌面快捷方式创建自定义右键单击上下文菜单项(Windows 资源管理器)

    问题很简单 我有很多桌面快捷方式 它们指向很多文件 但我也有很多快捷方式 它们指向这些快捷方式所指向的目录 我想通过简单地为所有快捷方式 lnk 文件 添加另一个右键菜单选项来消除这种冗余 该选项允许您将 explorer exe 打开到包
  • 使用 Google Apps 脚本将 Google 表格中的行追加到 Big Query 中的现有表

    我有一个 Google 表格 我想从中选择一些单元格并将它们作为行附加到 Big Query 中已存在的表格中 我编写了以下代码 运行时没有任何错误 但是当我检查 BQ 中的表时 它没有更新 function myFunction var
  • 让 MATLAB Mex 搜索特定文件夹中的库

    我创建了一个 mex 函数 它依赖于一个依赖于另一个库的库 当我执行该函数时 它在运行时输出以下错误 Invalid MEX file Library not loaded usr local lib libgomp 1 dylib 我的计
  • WPF 检查系统上是否安装了 python

    我的 wpf 应用程序调用 python 脚本来生成输出 稍后显示在 UI 中 如果用户系统上未安装 python 为了避免应用程序崩溃 我需要执行检查 目前我已经使用以下方法实现了这一点 ProcessStartInfo start ne
  • Groovy 重写compareTo

    我正在使用 Groovy 类别在 DSL 下工作 我需要覆盖 重载 操作员 然而却是已知问题 http jira codehaus org browse GROOVY 3364 当类实现Comparable Groovy 会调用compar