@Override and default methods
Brian Goetz
brian.goetz at oracle.com
Sun Nov 17 04:04:56 PST 2013
>> My concern is how intrusive default methods can be. If someone adds a
>> default method to a super interface and it conflicts with existing methods
>> in a sub-interface, you can't compile. This pattern is ought to repeat over
>> and over. JDK 9 or 10 or the future may continue to add new default methods
>> and break sub-interfaces.
>
> This was deemed an acceptable price to pay to allow the platform classes
> to move forward. Some code will need modification to run on Java 8.
Yes; the EG discussed this risk extensively (i.e., this is not a
surprise to us) and further explored and ultimately rejected a number of
mitigation strategies. We will continue to consider the option of
mitigation strategies going forward should things turn out to be worse
than projected.
These particular method signatures were taken from ConcurrentMap, so
that the methods from ConcurrentMap could (finally) be brought down to
all Maps. (Had default methods been around in 5, we would have likely
added them to Map at that time, but ConcurrentMap was the best we could
do at the time.) So the API design work for these particular
conflicting methods was done ten years ago.
Your gloom-and-doom "it will happen all the time, and it will be CHAOS!"
prediction is overblown; that assumes zero restraint on the part of JDK
maintainers. (If anything, the more common complaint against us is
usually "too much restraint". But it might result in more disruption
for users of third-party libraries, should their maintainers go
overboard.) But you are correct to observe that widely-implemented
interfaces such as Iterator, Iterable, Collection, List, Map, etc,
should be evolved minimally and carefully, as the more widely
implemented a type is, the more likely a conflict with subclass methods
will be. (Note that this is by no means a problem that is new with
default methods; we have had this problem with classes since day 1.)
Note also that this was one of the reasons we ultimately didn't put all
the map/filter/reduce methods directly on Collection; this would have
greatly increased the chance of collision, adding dozens of methods
instead of a few.
(In this particular case, we might also have had more options had we
heard from Apache earlier. Binary builds have been available for a
looong time.)
More information about the lambda-dev
mailing list