ディーン徐:
重複としてクローズしないようにするには、この質問は、と完全に異なっている。この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
(かもしれない最低の修正版)。