代码之家  ›  专栏  ›  技术社区  ›  Dean Xu

在将lambda与引发的重写异常一起使用时,“重写方法不引发异常”

  •  3
  • Dean Xu  · 技术社区  · 6 年前

    为了防止重复关闭,这个问题与 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 回复  |  直到 6 年前
        1
  •  0
  •   Dean Xu    6 年前

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

    推荐文章