【问题标题】:How to properly use equals() if comparing an object array index and an object?如果比较对象数组索引和对象,如何正确使用equals()?
【发布时间】:2018-09-18 00:07:59
【问题描述】:

根据answer,粗略地说,如果我们有一个学生对象的 Classroom 对象数组,class[index] != student1。我相信这是我在实现我的 equals 方法以将 array[index] 对象与另一个对象进行比较时所犯的错误。我相信 array[index] 和我要比较的对象是相同的。

下面的代码显示了我的 getNumStudents 方法,我在该方法中尝试计算学生 ID 在班级中出现的次数。 ID代表他或她喜欢的品牌鞋(课外练习)。这个方法在我的教室对象类中,它实现了一个接口。

@Override
public int getNumStudents(T anEntry) {
    int count = 0;
    for (int index = 0; index < numberOfEntries; index++) {

       if (roster[index].equals(anEntry)) )
        {
            counter++;
        } 
    } 

    return count;
}

我的equals方法就是这样,在学生类中实现:

public boolean equals(Student student) {
    if (this == student)
    {
        return true;
    }
    if (student == null)
    {
        return false;
    }
    if (this.getID() != student.getID())
    {
        return false;
    }

    return true;
}

我不知道我是否正确地进行了 hashCode 覆盖,但它是(在 Student 类中):

   @Override
    public int hashCode() {
    int result = 17;
    result = 31 * result + studentID;
    return result;
  }

我已经缩小了最有可能出现错误的位置:

   if (roster[index].equals(anEntry)) )

特别是

roster[index].equals(anEntry))

我应该调用什么或如何调整我的 getNumStudents(T anEntry) 方法以正确返回 Classroom 对象数组中具有特定 ID(代表鞋子类型)的学生人数?

【问题讨论】:

  • 如果 getId 是 int,你为什么不检查 roster[index].getId() == anEntry.getId()。
  • @AshraffAliWahab 我没有发布整个代码,但这是因为我在课堂上使用泛型
  • @AshraffAliWahab 另外,根据我的 IDE, roster[index] 和 anEntry 是两个不同的东西。不一样的类型。

标签: java arrays object equals


【解决方案1】:

您的equals 签名错误。

equals方法的正确签名必须如下。

public boolean equals(Object other)

然后在方法内部你应该检查它是否是可比较的类型,如果你真的需要它是Student类型,你必须检查这个并返回false否则。

在您的情况下,这将是您的实施所需的最小更改:

public boolean equals(Object other)
{
    if (this == other)
    {
        return true;
    }

    // This also works if `other` is `null`
    if (!(other instanceof Student))
    {
        return false;
    }

    // Now we cast it to `Student`
    final Student student = (Student) other;

    if (this.getID() != student.getID())
    {
        return false;
    }

    return true;
}

【讨论】:

  • 为什么是public boolean equals(Object obj)?实际上,我使用两个学生班级在我的 main 中使用 equals 进行了测试,并且它响应正确。 Object obj 基本上允许我在 getNumStudents 方法中处理我的 array[index] 引用吗?
  • 哇,谢谢,它确实有效!你能解释一下'我们将它转​​换为'Student'下面的代码吗?
  • @mobcityzkore 不知道该解释什么。在此行之前,您有一个通用的Object,因此您不能在其上调用Student 方法。为了让它充当Student,您必须对其进行转换。在调用instanceof 之前将其强制转换是不安全的,因为它可以抛出ClassCastException,并且通过equals 合约它必须接受任何类型的对象(例如Teacher),包括null,并返回@ 987654335@或false不抛出异常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 2016-02-01
相关资源
最近更新 更多