Trouble inferring type of lambda

Howard Lovatt howard.lovatt at gmail.com
Sat Aug 21 23:09:05 PDT 2010


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'.

  -- Howard.


More information about the lambda-dev mailing list