使用 lambda 并抛出覆盖异常时,“覆盖方法不会抛出异常”

为了防止重复关闭,这个问题和这个完全不同。


考虑我有以下界面


@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;

  }

}


茅侃侃
浏览 229回答 1
1回答

翻翻过去那场雪

这是一个已修复的 jdk 错误1.8.0_171(可能不是最低修复版本)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java