重複して閉じられないようにするために、この質問はこの質問とはまったく異なります。
次のインターフェースがあると考えてください
@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;
}
}