Overload Ambiguity

Zhong Yu zhong.j.yu at gmail.com
Fri Jul 12 15:03:09 PDT 2013


Consider these three methods
http://gee.cs.oswego.edu/dl/jsr166/dist/docs/java/util/concurrent/CompletionStage.html

    public interface CompletionStage<T>

       CompletionStage<Void> thenRun(Runnable action)

       CompletionStage<Void> thenAccept(Consumer<? super T> action)

        <U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn)

Would it be safe to overload them, e.g. name all three as "then()"?
(assuming that's a good idea)

       then(()->void)
       then(T->void)
       <U> then(T->U)

Could this overloaded design cause any ambiguity anywhere, or cause
other kinds of problems?

==

Another question. Consider these two methods

    interface Foo<T>

#1    <R> Foo<R> map( F1<T, R> );
#2    <R> Foo<R> map( F2<T, Foo<R>> );  // AKA "flat map"

where F1 and F2 are exactly like Function, and there's no subtyping
relationship between the two.

The two map() methods may create ambiguity when both are applicable to
a lambda expression (that returns a Foo<?>). However, is there a
notion that #2 is more specific than #1, therefore #2 is chosen over
#1?

(Analogy - according to JLS7, #4 is more specific than #3

#3    <R> void foo(R)
#4    <R> void foo(List<R>)

intuitively whenever #4 is applicable, #3 is applicable. So is there a
similar rule for cases like #1 and #2?)

If the answer is no, I guess we can always make F2<:F1, which makes #2
more specific than #1, correct?

Thanks,
Zhong Yu


More information about the lambda-dev mailing list