import java.util.Arrays; import static java.lang.System.out; final class LambdaMain { public static void main(final String... args) { for (final A<String, X> a : Arrays.<A<String, X>>asList(new A<String, X>() { @Override public String foo(final String ignored) throws X { throw new X(); } }, ignored -> { throw new X(); })) try { test(a, "Bob"); } catch (final X x) { x.printStackTrace(); } try { out.println(test(new A<String, X>() { @Override public String foo(final String ignored) throws X { throw new X(); } }, "Bob")); } catch (final Exception e) { e.printStackTrace(); } try { out.println(test(ignored -> { throw new X(); }, "Bob")); } catch (final Exception e) { e.printStackTrace(); } } static class X extends Exception {} interface A<T, E extends Exception> { T foo(T ignored) throws E; } static <T, E extends Exception> T test(final A<T, E> a, final T ignored) throws E { return a.foo(ignored); } } final class LambdaMainTest { public void main(A<String> a) { println(test(a)); } public void println(boolean x) {} public void println(String x) {} interface A<T> { T foo(T ignored) ; } static <T> T test (final A<T> a) { return null; } }