重写 java equals() 方法 - 不起作用?

2023-11-24

我遇到了一个有趣的(而且非常令人沮丧的)问题equals()今天的方法导致我认为经过良好测试的类崩溃并导致一个错误,我花了很长时间才找到它。

为了完整起见,我没有使用 IDE 或调试器 - 只是使用老式文本编辑器和 System.out。时间非常有限,而且这是一个学校项目。

无论如何——

我正在开发一个基本的购物车,其中可以包含ArrayList of Book objects。为了实施addBook(), removeBook(), and hasBook()购物车的方法,我想检查是否Book已经存在于Cart。所以我走了-

public boolean equals(Book b) {
    ... // More code here - null checks
    if (b.getID() == this.getID()) return true;
    else return false;
}

测试中一切正常。我创建了 6 个对象并用数据填充它们。在上执行许多添加、删除、has() 操作Cart一切正常。我读到你可以要么有equals(TYPE var) or equals(Object o) { (CAST) var }但假设既然它正在工作,那就没什么太大关系了。

然后我遇到了一个问题 - 我需要创建一个Book对象与only the ID在 Book 类中。不会将其他数据输入其中。基本上有以下几点:

public boolean hasBook(int i) {
    Book b = new Book(i);
    return hasBook(b);
}

public boolean hasBook(Book b) {
    // .. more code here
    return this.books.contains(b);
}

突然间,equals(Book b)方法不再有效。在没有良好的调试器并假设的情况下,这花了很长时间来追踪Cart类经过适当测试并且正确。交换后equals()方法如下:

public boolean equals(Object o) {
    Book b = (Book) o;
    ... // The rest goes here   
}

一切又开始运转了。该方法是否有理由决定不采用 Book 参数,即使它很明显 was a Book目的?唯一的区别似乎是它是在同一个类中实例化的,并且只填充了一个数据成员。我非常非常困惑。请透露一些信息?


在Java中,equals()继承自的方法Object is:

public boolean equals(Object other);

换句话说,参数的类型必须是Object。这就是所谓的压倒性的;你的方法public boolean equals(Book other)做所谓的超载 to the equals() method.

The ArrayList使用被覆盖的equals()比较内容的方法(例如,其contains() and equals()方法),not超载的。在大多数代码中,调用未正确覆盖的代码Object的 equals 很好,但不兼容ArrayList.

因此,不正确地重写该方法可能会导致问题。

我每次都覆盖等于以下内容:

@Override
public boolean equals(Object other){
    if (other == null) return false;
    if (other == this) return true;
    if (!(other instanceof MyClass)) return false;
    MyClass otherMyClass = (MyClass)other;
    ...test other properties here...
}

使用@Override注释可以帮助解决很多愚蠢的错误。

每当您认为要重写超类或接口的方法时,请使用它。这样,如果您以错误的方式执行此操作,则会出现编译错误。

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

重写 java equals() 方法 - 不起作用? 的相关文章

  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • 使用 Tabula 通过 Python 读取 pdf 时出现 Java 错误

    我已经安装了 tabula 库 用于使用 python 将 pdf 读取到 pandas 数据框中 但是当我运行代码时 import tabula df tabula read pdf sample1 pdf pages 1 我得到了例外
  • TreeMap 删除所有大于某个键的键

    在项目中 我需要删除键值大于某个键的所有对象 键类型为Date 如果重要的话 据我所知TreeMapJava中实现的是红黑树 它是一种二叉搜索树 所以我应该得到O n 删除子树时 但除了制作尾部视图并一一删除之外 我找不到任何方法可以做到这
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • java inputstream 打印控制台内容

    sock new Socket www google com 80 out new BufferedOutputStream sock getOutputStream in new BufferedInputStream sock getI
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • 如何在java中将日期格式从YYMMDD更改为YYYY-MM-DD? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我从机器可读代码中获取日期格式为 YYMMDD 如何将其更改为 YYYY MM DD 例如我收到 871223 YYMMDD 我想把它改成
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 从jar中获取资源

    我有包含文件的 jar myJar res endingRule txt myJar wordcalculator merger Marge class 在 Marge java 中我有代码 private static final Str
  • Java继承,扩展类如何影响实际类

    我正在查看 Sun 认证学习指南 其中有一段描述了最终修饰符 它说 如果程序员可以自由地扩展我们所知的 String 类文明 它可能会崩溃 他什么意思 如果可以扩展 String 类 我是否不会有一个名为 MyString 的类继承所有 S
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • MiniDFSCluster UnsatisfiedLinkError org.apache.hadoop.io.nativeio.NativeIO$Windows.access0

    做时 new MiniDFSCluster Builder config build 我得到这个异常 java lang UnsatisfiedLinkError org apache hadoop io nativeio NativeIO
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于

随机推荐

  • WooCommerce:在订单中保存对产品的更改时挂钩

    我已经找了好几个小时了 在编辑现有订单中的产品数量后 我无法弄清楚如何在单击 保存 时执行功能 我试过这个 add action woocommerce order edit product your function name funct
  • 使用 requireJs 的模块中的循环依赖关系

    阅读 requireJs 文档 为了修复循环依赖 建议使用exports为该模块创建一个空对象 该对象可立即供其他模块引用 我尝试了这段代码 但它似乎不起作用 怎么了 P S 阅读评论以查看输出 特别是 setTimeout 调用中的 B
  • 如何在我的网络服务器上检测移动客户端?

    当http请求到达我的服务器时 我如何检测它是否来自iphone android或其他设备 您可以获取用户代理 这表明它是什么浏览器类型 iphone chrome 即任何浏览器 来帮你 http whatsmyuseragent com
  • 使用ggplot2的stat_密度_2d仅显示高密度区域

    我想将 stat 密度2D 函数与分类变量一起使用 但将绘图限制在高密度区域 以减少重叠并提高易读性 我们以以下数据为例 plot data lt data frame X c rnorm 300 3 2 5 rnorm 150 7 2 Y
  • C++:使用向量/数组优化速度?

    我有一个嵌套的 for 循环结构 现在我在每次迭代开始时重新声明向量 void function n1 n2 bound etc for int i 0 i
  • 将 InputStream 读入 Data 对象

    在 Swift 3 x 中 我们通常使用以下方式处理二进制数据Data 从它你可以生成大多数其他重要的类型 并且它上面有有用的函数 但我如何创建一个Data从一个InputStream 有什么好的办法吗 我找不到好的方法 我们可以围绕不安全
  • 什么编程语言最像英语? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我主要是一名Python程
  • Bootstrap 4 与远程 Modal

    我无法使用新的 Twitter Bootstrap 版本 Bootstrap 4 alpha 让 Modal 在远程模式下工作 它与 Bootstrap 3 完美配合 使用 Bootstrap 4 我收到弹出窗口 但模型主体未加载 没有进行
  • 实施 Azure 共置缓存

    使用 VS2012 我从 WebRole Properties Caching Tab 添加了缓存功能 其中 它在 web config 中生成了以下 XML
  • 复合视图模型对象导致远程验证失败

    我在这个项目中的一些表单中使用了复合视图模型的模式 它运作得很好 在本例中 我有一个 VendorAddress 视图模型 我在这个项目的几个地方使用了 Address es 因此我制作了可以重复使用的 Address 视图模型对象 然后我
  • Airflow:为每个文件运行 DAG 的正确方法

    我有以下任务需要解决 文件通过端点不定期发送并存储在本地 我需要为每个文件触发 DAG 运行 对于每个文件 将执行相同的任务 总体流程如下 对于每个文件 运行任务 A gt B gt C gt D 正在批量处理文件 虽然这项任务对我来说似乎
  • 鼠标按下。兄弟姐妹 event.targets 上的传播

    我有 2 个具有 绝对位置 的兄弟节点 它们都处理 mousedown 事件 当我单击 div 2 的透明区域 如图所示 时 如何触发 div 1 的处理程序 如果重叠元素是动态的 我认为不可能使用常规事件冒泡来完成此操作 因为所讨论的两个
  • Azure Fluent API 创建 SQL Server 时出错 - 缺少 x-ms-request-id 标头

    我正在尝试使用 Azure Fluent API 创建一个新的 SQL Server https github com Azure azure sdk for net tree Fluent 但我总是得到 Microsoft Rest Az
  • 如何在代码中使用 wsDualHttpBinding 设置 WCF 客户端?

    我需要连接到我编写的 WCF 服务 而无需为我正在编写的客户端应用程序部署 app config 然而 我一直在努力弄清楚如何在代码中从客户端进行设置 据我所知 有人知道我需要做什么才能让它发挥作用吗 我真的很感激 这是我到目前为止得到的代
  • 如何在 Python 中找到正则表达式的所有匹配项?

    在我正在编写的程序中 我让 Python 使用re search 函数在文本块中查找匹配项并打印结果 但是 一旦在文本块中找到第一个匹配项 程序就会退出 在找到所有匹配项之前程序不会停止的情况下 如何重复执行此操作 有一个单独的函数可以做到
  • 根据目标类型的无形状贴图 HList

    我有以下问题 我想将 HList 的项目映射到另一个 HList 但如果 目标 类型是 URL 则源 HList 中的字符串只能转换为 URL val name Stackoverflow val url https stackoverfl
  • 如何通过JQuery ajaxSend事件覆盖成功函数

    我试图覆盖 ajaxsend 事件的成功函数 但它不起作用 这是代码 document ajaxSend function event xhr options console log ajaxSend var tempSuccess opt
  • 如何每两周在周一和周二运行石英时间表?

    我使用以下方式每两周的星期一运行一次计划 ITrigger trigger TriggerBuilder Create StartAt DateBuilder DateOf StartHour StartMinute StartSecond
  • 为什么 Windows 不允许在模拟其他用户时启动 WinSock

    使用我自己的程序或其他程序 如果进程是使用 CreateProcessWithLogonW 或 CreateProcessAsUserW 创建的 则在调用时我无法运行 Winsock 当我创建套接字时它返回此错误 WSAEPROVIDERF
  • 重写 java equals() 方法 - 不起作用?

    我遇到了一个有趣的 而且非常令人沮丧的 问题equals 今天的方法导致我认为经过良好测试的类崩溃并导致一个错误 我花了很长时间才找到它 为了完整起见 我没有使用 IDE 或调试器 只是使用老式文本编辑器和 System out 时间非常有