| /* | |
| * @test /nodynamiccopyright/ | |
| * @bug 8066974 8062373 | |
| * @summary Compiler doesn't infer method's generic type information in lambda body | |
| * @compile/fail/ref=T8066974.out -XDrawDiagnostics T8066974.java | |
| */ | |
| class T8066974 { | |
| static class Throwing<E extends Throwable> { } | |
| static class RuntimeThrowing extends Throwing<RuntimeException> { } | |
| static class CheckedThrowing extends Throwing<Exception> { } | |
| interface Parameter { | |
| <E extends Throwable> Object m(Throwing<E> tw) throws E; | |
| } | |
| interface Mapper<R> { | |
| R m(Parameter p); | |
| } | |
| <Z> Z map(Mapper<Z> mz) { return null; } | |
| <Z extends Throwable> Mapper<Throwing<Z>> mapper(Throwing<Z> tz) throws Z { return null; } | |
| static class ThrowingMapper<X extends Throwable> implements Mapper<Throwing<X>> { | |
| ThrowingMapper(Throwing<X> arg) throws X { } | |
| @Override | |
| public Throwing<X> m(Parameter p) { | |
| return null; | |
| } | |
| } | |
| void testRuntime(RuntimeThrowing rt) { | |
| map(p->p.m(rt)); | |
| map(mapper(rt)); | |
| map(new ThrowingMapper<>(rt)); | |
| map(new ThrowingMapper<>(rt) {}); | |
| } | |
| void testChecked(CheckedThrowing ct) { | |
| map(p->p.m(ct)); | |
| map(mapper(ct)); | |
| map(new ThrowingMapper<>(ct)); | |
| map(new ThrowingMapper<>(ct) {}); | |
| } | |
| } |