This implementation creates a hashCode() and an equals() method intended to
be used in value types: The implementation assumes that two objects are equal
(and provide the same hashCode) if all values of all fields are equal.
About the implementation:
To deal with reference types of fields and with supertypes, the
implementation calls hashCode() and equals() on reference types of fields and
on the superclass (except if the superclass is Object).