Overload issue - more-specific-ness
Peter Levart
peter.levart at gmail.com
Fri Mar 14 08:10:47 UTC 2014
On 03/14/2014 12:48 AM, Zhong Yu wrote:
> Consider this program:
>
> // like Runnable, but throws
> interface RunnableX extends Callable<Void>
> {
> void run() throws Exception;
>
> default Void call() throws Exception
> {
> run();
> return null;
> }
> }
>
> static void foo(RunnableX r){}
> static void foo(Callable<List<?>> c){}
>
> The overload should be fine, because both functional interfaces are
> 0-arg. And foo#2 should be more specific than foo#1.
>
> However the following program fails to compile
>
> public void test()
> {
> foo( ()->new ArrayList<Void>() );
> // javac: reference to foo is ambiguous
> // both method foo(RunnableX) and method foo(Callable<List<?>>) match
> }
>
> Is it the correct behavior or a bug? It seems to me that foo#2 should
> be the most-specific method here.
>
> ( If RunnableX does NOT extend Callable<Void>, the program compiles.)
...and selects foo(Callable). So when interfaces are not related the
structural type of Callable is prefered to that of RunnableX. If
RunnableX is related to (a subtype of) Callable then most specific rule
should prevail. I think. But it seems that structural fitness and
subtype specificness have equal weight here, so compiler is undecided.
Regards, Peter
>
> Thanks,
> Zhong Yu
>
More information about the lambda-dev
mailing list