Overload Ambiguity
Zhong Yu
zhong.j.yu at gmail.com
Fri Jul 12 15:55:00 PDT 2013
Thanks Dan, the overloading resolution is really powerful stuff. It
solves two use cases that have been bothering me:
1. Returning Void
Say we have a method
<U> then(T->U)
it's a little inconvenient if caller intends U=Void, because he has to
return something:
then(x->{ return null; })
Now we can add an overloaded version
then(T->void)
then(x->{});
2. Flat Map
Wouldn't it be nice if we can overload
interface Foo<T>
<R> Foo<U> map( Function<T, U> );
<R> Foo<U> map( Function<T, Foo<U>> ); // AKA "flat map"
The first problem is erasure, we cannot have two map(Function). But we
can add another Function-ish type, and overloading now works.
/** same as Function; provided for some method overloading cases
interface _Function<T,U> extends Function<T,U>{}
I don't think it'll cause any problem for API users; they'll rarely
need to reference _Function by name.
This means we can implement the so called "Promise/A+" interface in Java
interface Promise<T>
<U> Promise<U> then(Function<T, U> onSuccess);
<U> Promise<U> then(Function<T, U> onSuccess,
Function<Exception, U> onFailure);
<U> Promise<U> then(_Function<T, Promise<U>> onSuccess);
<U> Promise<U> then(_Function<T, Promise<U>> onSuccess,
_Function<Exception,
Promise<U>> onFailure);
Zhong Yu
More information about the lambda-dev
mailing list