Lalaland Lalaland - 1 year ago 42
Java Question

Java 8 generics + exceptions compile time error when using a lambda expression

A couple of days ago, I started refactoring some code to use the new Java 8 Streams library. Unfortunately, I ran into a compile time error when performing Stream::map with a method which is declared to throw a generic E that is further specified to be a RuntimeException.

Interesting enough, the compile time error goes away when I switch to using a method reference.

Is this a bug, or is my method reference not equivalent to my lambda expression?

(Also, I know I can replace p->p.execute(foo) with Parameter::execute. My actual code has additional parameters for the execute method).

Error message

Error:(32, 43) java: unreported exception E; must be caught or declared to be thrown


import java.util.ArrayList;
import java.util.List;

public class JavaBugTest
interface AbleToThrowException<E extends Exception>

interface Parameter {
public <E extends Exception> Object execute(AbleToThrowException<E> algo) throws E;

interface ThrowsRuntimeException extends AbleToThrowException<RuntimeException>

static ThrowsRuntimeException foo;

public static Object manualLambda(Parameter p)
return p.execute(foo);

public static void main(String[] args)
List<Parameter> params = new ArrayList<>(); -> p.execute(foo)); // Gives a compile time error.; // Works fine.


System setup

  • OS: Windows x64

  • Java compiler version: Oracle JDK 1.8.0_11

  • IDE: Intellij

Answer Source

A very simple solution is to explicitly provide a type argument for Parameter#execute(..). -> p.<RuntimeException>execute(foo)); // Gives a compile time error.

Without the explicit type argument, it seems like the JDK compiler cannot infer a type argument from the invocation context, though it should. This a bug and should be reported as such. I have now reported it and will update this question with new details when I have them.

Bug Report