java - 在采用 Object 参数的 Java 方法中,您如何访问仅存在于特定类实例的字段?

标签 java object field

-- 是的,这是一个关于家庭作业的问题,寻求帮助。不,这不是我要你帮我做作业。截止日期是半小时前;我真的无法更改我的提交。你只需要相信我的话。继续……

我知道不需要测试对象的类型。当我寻找有关“instanceof”的详细信息时,我发现了六个线程,其中人们的回应只是告诉原始发帖人,如果他们必须在处理之前进行测试以找出他们正在处理的对象类型,那么他们就犯了一个错误它。是的,我知道,我愿意遵守惯例。不幸的是,我的教授要求我们覆盖我们定义的类的 equals 方法,并且特别需要一个 Object 类型参数。如果你看到我的代码,你可能会更好地理解:

public boolean equals(Course other){
    if(!(other instanceof Course)){
        return false;
    } else if(other.name==this.name && other.days==this.days && 
        other.start==this.start && other.end==this.end){
        return true;
    }
    return false;
}

您可能会明白我的意思。 “其他”参数应该是对象类型,但如果我将其保留为对象并使用名称/天数/开始/结束字段,则该程序很合适。如果我将其更改为 Course,当然可以(没有双关语意),但那将是一种完全不同的方法。期望的行为是对于除 Course 实例之外的所有对象,使该方法返回 false,此外,对于 Course 实例之间不匹配的数据,使其返回 false。

对于所有非常了解 Java 的人,看到这些问题感到沮丧,我深表歉意。

最佳答案

如果您想覆盖“equals”方法,您应该使用 Object 作为参数,因此您必须检查对象的类型。通常你自己的实现看起来像这样:

@Override
public boolean equals(Object obj) {
    if (obj == this)
        return true;  // object's references are identical
    else if (!(obj instanceof Course))
        return false;

    Course that = (Course) obj;
    return (this.name.equals(that.name)) && (this.days == that.days)
        && (this.start.equals(that.start)) && (this.end.equals(that.end));
}

当然,您也应该使用相同的重要字段覆盖“hashCode”。


相反,您使用自己的 Course 类型参数重载该方法。因此,如果您调用 myobject.equals(anotherObject) 并且 anotherObject 不是 Course 类型,您的“equals”方法将永远不会被调用,而是Object#equals 方法将被调用,它仅执行以下操作:return this == obj .


重载“equals”方法还不够的原因是还需要重载“hashCode”,它没有参数,因此不能重载。

  • 如果您自己编写boolean equals(Object) 的实现,您必须还实现int hashCode()
  • 这两种方法都应该对“hashCode”和“equals”使用相同的重要字段。
  • 如果 a.equals(b) == true 则以下必须也为真:a.hashCode() == b.hashCode()
  • 另外,如果 a.hashCode() != b.hashCode() 那么 a.equals(b) == false

最后一点是你不应该用你自己的类型重载“equals”的主要原因:

Course c1 = new Course("myname");
Course c2 = new Course("myname");
c1.equals(c2);                   // true
c1.hashCode() == c2.hashCode();  // false

关于java - 在采用 Object 参数的 Java 方法中,您如何访问仅存在于特定类实例的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9901195/

相关文章:

java - 创建jar文件时出错: NoClassDefFoundError

java - 为什么像 List/Map/Set.of(...) 或 Arrays.asList(...) 这样的方法会返回不可变列表?

java - 64 位 Java VM 运行应用程序速度慢 10 倍

jquery - 手动验证我的表单

c# - 不能在不同的命名空间中使用我的新字段

javascript - 2 表单中字段的名称属性

java - 异步文件上传 Servlet

c++ - 如何编写一个函数来测试链接列表是否已排序

javascript - 如何在 React View 中显示对象数组中的随机值

java - 用JAVA写一个卖通票的方法,另一个卖票的方法