【问题标题】:Overriding equals: Telling IDE its okay to have different values?覆盖等于:告诉 IDE 可以有不同的值?
【发布时间】:2014-11-06 18:31:28
【问题描述】:

假设,我有一个班级,叫它学生。学生类有一个元素,一个称为 Id 的 int。我想重写equals,这样如果将Student与Integer进行比较,该方法将返回true。喜欢:

public class OverrideTest {
    public static void main(String[] args) {

        Student a = new Student();
        a.setId(5);
        System.out.println(a.equals(5));
    }

    public static class Student {

        private int id;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        @Override
        public boolean equals(Object o) {
            if (o instanceof Student) {
                Student a = (Student) o;
                if (a.getId() == this.getId())
                    return true;
            }
            if (o == this)
                return true;
            if (o instanceof Integer) {
                int id = (Integer) o;
                if (id == this.getId())
                    return true;
            }
            return false;
        }
    }

}

有没有办法向 IDE 发出信号表明一切正常且无需发送警告?

这将返回 true,但在 IDE 中会出现语法警告。

【问题讨论】:

  • 我没有看到任何警告..
  • 我建议您阅读 this question 并寻找在覆盖 equals 时需要注意的事项。
  • 例如,如果你使用 boolean equals = student.equals(5),就会出现警告。
  • 该警告很可能来自您的 IDE,而不是 JVM 本身。
  • 不过,这可以。它违反了equals 的合约,其中包括对称性(a.equals(b) == b.equals(a))。您无法让Integer.equals 同意您的定义,因此您的定义将被破坏。

标签: java jvm


【解决方案1】:

正如 Yshavit 所说,虽然你可以做你想做的事,但这是非常危险的,因为它破坏了 .equals(...) 关系的对称性。例如,考虑:

Student s = new Student(5);
Integer i = new Integer(5);
if(s.equals(i)) System.out.println("s equals i");
else System.out.println("s doesnt equal i");
if(i.equals(s)) System.out.println("i equals s");
else System.out.println("i doesnt equal s");

输出:

s equals i
i doesnt equal s

从逻辑上讲,这没有任何意义。可能有一种方法可以说服您的 IDE 忽略此处的警告,但您几乎肯定应该注意它,而不是让 Student 能够等于 Integers。

equals(..) 方法在容器内部使用,例如HashSets,因此该方法会导致内置结构中的行为不稳定。

More about overriding equals(...)

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多