Overload resolution simplification
Dan Smith
daniel.smith at oracle.com
Fri Aug 9 16:39:44 PDT 2013
On Aug 9, 2013, at 2:21 PM, Remi Forax <forax at univ-mlv.fr> wrote:
> Also I've a nice parsing framework that use type specialised lambda to avoid boxing that doesn't compile anymore.
>
> public IntStream parse(BufferedReader reader, ToIntFunction<String> fun) { ... }
> public LongStream parse(BufferedReader reader, ToLongFunction<String> fun) { ... }
>
> when called like this: parse(Integer::parseInt).
Thanks for the use case.
The 'parse' method is essentially the same shape as the 'map' method that was discussed by the EG quite a bit, with the eventual conclusion that it would be clearer to give each method a different name (parseInts, parseLongs, etc.).
http://mail.openjdk.java.net/pipermail/lambda-libs-spec-experts/2013-February/001417.html
http://mail.openjdk.java.net/pipermail/lambda-libs-spec-experts/2013-March/001441.html
http://mail.openjdk.java.net/pipermail/lambda-libs-spec-experts/2013-March/001458.html
Doesn't mean that all other developers must follow our lead, but the fact that the EG tried it and then concluded that it didn't want overloading here is a strong argument that this is potentially a bad convention to follow.
If somebody likes this convention anyway, then we made a special-case effort to support method references. Unfortunately, Integer::parseInt is overloaded and so outside of the set of supported method references. As I mentioned in the EG meeting, by drawing the line like this, it's great when it works, and annoying when it doesn't and you fall off of a cliff. We considered using arity (e.g., "is this overloaded with arity 1?"), but that just moves the line, rather than solving the problem.
So, I don't love the cliff, but I don't have a good alternative, other than just not having any special treatment at all.
—Dan
More information about the lambda-spec-experts
mailing list