Overload issue - more-specific-ness
    Zhong Yu 
    zhong.j.yu at gmail.com
       
    Thu Mar 13 23:48:12 UTC 2014
    
    
  
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.)
Thanks,
Zhong Yu
    
    
More information about the lambda-dev
mailing list