当使用lambda并引发覆盖异常时,“覆盖方法不会引发异常”

时间:2018-08-13 03:57:24

标签: java override javac javacompiler

为防止重复出现,该问题与this one完全不同。

考虑我有以下界面

@FunctionalInterface
interface FuncE0<R, E extends Exception> {
  R call() throws E;
}

在lambda上正常工作

FuncE0<Integer, IOException> get() {
  return () -> 1;
}

但是,如果我让接口从Callable扩展,则会中断。

@FunctionalInterface
interface FuncE0<R, E extends Exception> extends Callable<R> {
  @Override
  R call() throws E;
}

用法相同。编译器给我以下错误

JustTest.java:8: error: call() in <anonymous JustTest$> cannot implement call() in FuncE0
    return () -> 1;
           ^   overridden method does not throw Exception
  • 如果您在R call() throws E中删除覆盖方法FuncE0,它将起作用。
  • 如果您使用匿名类,它将起作用。
  • 如果使用eclipse,则ECJ起作用。

当我覆盖抛出的异常时会发生什么?这是javac错误吗?

我正在使用jdk_1.8_112

最小化代码以重现

import java.io.IOException;
import java.util.concurrent.Callable;

public class JustTest {
  public static FuncE0<Integer, IOException> get() {
    return () -> 1;
  }

  @FunctionalInterface
  public interface FuncE0<R, E extends Exception> extends Callable<R> {
    @Override
    R call() throws E;
  }
}

1 个答案:

答案 0 :(得分:0)

这是一个jdk错误,已修复1.8.0_171(可能不是最低修复版本)。