4

重複して閉じられないようにするために、この質問はこの質問とはまったく異なります

次のインターフェースがあると考えてください

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

1 に答える 1