| /* |
| * @test /nodynamiccopyright/ |
| * @summary smoke test for inference of throws type variables |
| * @compile/fail/ref=TargetType63.out -XDrawDiagnostics TargetType63.java |
| */ |
| class TargetType63 { |
| |
| interface F<T extends Throwable> { |
| void m() throws T; |
| } |
| |
| void g1() { } |
| void g2() throws ClassNotFoundException { } |
| void g3() throws Exception { } |
| |
| <Z extends Throwable> void m1(F<Z> fz) throws Z { } |
| <Z extends ClassNotFoundException> void m2(F<Z> fz) throws Z { } |
| |
| void test1() { |
| m1(()->{ }); //ok (Z = RuntimeException) |
| m1(this::g1); //ok (Z = RuntimeException) |
| } |
| |
| void test2() { |
| m2(()->{ }); //fail (Z = ClassNotFoundException) |
| m2(this::g1); //fail (Z = ClassNotFoundException) |
| } |
| |
| void test3() { |
| m1(()->{ throw new ClassNotFoundException(); }); //fail (Z = ClassNotFoundException) |
| m1(this::g2); //fail (Z = ClassNotFoundException) |
| m2(()->{ throw new ClassNotFoundException(); }); //fail (Z = ClassNotFoundException) |
| m2(this::g2); //fail (Z = ClassNotFoundException) |
| } |
| |
| void test4() { |
| m1(()->{ throw new Exception(); }); //fail (Z = Exception) |
| m1(this::g3); //fail (Z = Exception) |
| } |
| } |