> On May 14, 2015, at 7:24 AM, Remi Forax <fo...@univ-mlv.fr> wrote: > > On 05/14/2015 03:05 PM, Brian Goetz wrote: >>>> Not only is there a problem with modCount, but also with >>>> equals/hashCode/toString. You can’t define these Object methods in an >>>> interface. >>> They could be defined as static methods to delegate to. From API >>> consistency perspective, we have for example the following static methods >>> on primitive wrapper classes: >> Right. We considered this during Lambda, but by the time we got here, we >> concluded that this was mostly trading one downside for another. It seemed >> overwhelmingly likely that people would forget to override >> equals/hashCode/toString in this case, and create collections that violated >> the contract. >> > > The other problem is that it creates ambiguous method references, > if you have a class or an interface like: > class A { > public static int hashCode(A a) { ... } > } > > A::hashCode is ambiguous.
An easy solution to both of these problems is to use a different name. We discussed this as a workaround when designing the "no default 'hashCode' method" restriction. interface List<E> { ... /** Returns the hash code for this list. The hash code of a list is defined as ... */ int hashCode(); /** Computes a hash code consistent with the specification of 'hashCode'. */ default int defaultHashCode() { ... } } (Details like whether it's static or instance, and what interface it lives in, are flexible.) —Dan