压倒平等:告诉IDE可以有不同的价值观吗?

Pau*_*hek 0 java jvm

假设,我有一个班级,称之为学生.student类有一个元素,一个名为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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉IDE这是可以的,不需要发送警告?

返回true,但在IDE中出现语法警告.

Msh*_*nik 5

正如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");
Run Code Online (Sandbox Code Playgroud)

输出:

s equals i
i doesnt equal s
Run Code Online (Sandbox Code Playgroud)

从逻辑上讲,这没有任何意义.可能有一种方法可以说服你的IDE忽略这里的警告,但你几乎肯定应该注意它,而不是让学生能够等于整数.

equals(..)方法在容器内部使用HashSets,因此这种方法会导致内置结构中出现不稳定的行为.

关于压倒平等的更多信息(...)