An equality test between objects with incompatible types always returns false
- Severity
- WARNING
- Has Fix?
- NO_FIX
The problem
Consider the following code:
String x = "42"; Integer y = 42; if (x.equals(y)) { System.out.println("What is this, Javascript?"); } else { System.out.println("Types have meaning here."); }
We understand that any Integer
will not be equal to any String
. However, the signature of the equals
method accepts any Object, so the compiler will happily allow us to pass an Integer to the equals method. However, it will always return false, which is probably not what we intended.
This check detects circumstances where the equals method is called when the two objects in question can never be equal to each other. We check the following equality methods:
java.lang.Object.equals(Object)
java.util.Objects.equals(Object, Object)
com.google.common.base.Objects.equal(Object, Object)
I'm trying to test to make sure my equals method works
Good! Many tests of equals methods neglect to test that equals on an unrelated object return false.
We recommend using Guava's EqualsTester to perform tests of your equals method. Simply give it a collection of objects of your class, broken into groups that should be equal to each other, and EqualsTester will ensure that:
- Each object is equal to each other object in the same group as that object
- Each object is equal to itself
- Each object is unequal to all of the other objects not in the group
- Each object is unequal to an unrelated object (Relevant to this check)
- Each object is unequal to null
- The
hashCode
of each object in a group is the same as the hash code of each other member of the group
Read full article from EqualsIncompatibleType
No comments:
Post a Comment