Trouble inferring type of lambda

maurizio cimadamore maurizio.cimadamore at oracle.com
Sun Aug 22 10:45:14 PDT 2010


On 22/08/2010 07:09, Howard Lovatt wrote:
> For:
>
>    public interface Method1<R, A1, throws E>  { public R call( A1 a1 ) throws E; }
>
> and:
>
>    public<throws E>  void forEach( final Method1<Integer, Integer, E>
> method ) throws E { ... }
>
> The compiler has trouble with:
>
>     il.forEach( #( i ) { throw new Exception(); } ); // Need to catch
> checked exception
>
> Giving:
>
> lambdas/Main.java:34: method forEach in class IntList11 cannot be
> applied to given types
>        il.forEach( #( i ) { throw new Exception(); } ); // Need to
> catch checked exception
>          ^
>    required: Method1<Integer,Integer,E>
>    found: #void(?)(Exception)
>    where E is a type-variable:
>      E extends Exception declared in method
> <E>forEach(Method1<Integer,Integer,E>)
>
> Qualifying doesn't help:
>
>    Method1<Integer, Integer, Exception>  #( i ) { throw new Exception(); }
>
> It gives:
>
> lambdas/Main.java:34: incompatible types; no instance(s) of type
> variable(s) ? exist so that #void(?)(Exception) conforms to
> Method1<Integer,Integer,Exception>
>        il.forEach( Method1<Integer, Integer, Exception>  #( i ) { throw
> new Exception(); } ); // Need to catch checked exception
>                    ^
>    required: Method1<Integer,Integer,Exception>
>    found:    #void(?)(Exception)
>
> Is the problem that the return type isn't expressible? It isn't really
> void, it is 'NeverReturns'.
>    
Uhmm the problem here seems more related with a failure in inference of 
the lambda parameter (the '?' that you are seeing). Again it would be 
helpful to see the declaration of the receiver class as well as the type 
of 'il'.

Maurizio
>    -- Howard.
>
>    



More information about the lambda-dev mailing list