canEqual (of @EqualsAndHashCode fame) should be protected instead of public.