オーバーライド例外で使用するラムダが投げられたときに「オーバーライドされたメソッドが例外をスローしません」

ディーン徐:

重複としてクローズしないようにするには、この質問は、と完全に異なっている。この1

私は次のインタフェースを持って考えてみましょう

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

これは、ラムダと罰金を動作します

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;
  }
}
ディーン徐:

これは、修正されたJDKのバグである1.8.0_171(かもしれない最低の修正版)。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=195758&siteId=1