'Metode yang diganti tidak memunculkan Pengecualian' saat menggunakan lambda dengan pengecualian yang diganti

Untuk mencegah ditutup sebagai duplikat, pertanyaan ini sangat berbeda dengan yang ini.

Anggap saja saya memiliki antarmuka berikut

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

Ini berfungsi baik dengan lambda

FuncE0<Integer, IOException> get() {
  return () -> 1;
}

Tetapi jika saya membiarkan antarmuka meluas dari Callable, itu rusak.

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

Dengan penggunaan yang sama. Complier memberi saya kesalahan berikut

JustTest.java:8: error: call() in <anonymous JustTest$> cannot implement call() in FuncE0
    return () -> 1;
           ^   overridden method does not throw Exception
  • Jika Anda menghapus metode override R call() throws E di FuncE0, itu berhasil.
  • Jika Anda menggunakan kelas anonim, itu berfungsi.
  • Jika Anda menggunakan gerhana, ECJ berfungsi.

Apa yang terjadi ketika saya mengganti pengecualian yang dilempar? Apakah ini bug javac?

Saya menggunakan jdk_1.8_112

Minimalkan kode untuk direproduksi

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

person Dean Xu    schedule 13.08.2018    source sumber
comment
kode Anda berfungsi untuk saya tanpa masalah apa pun   -  person Deadpool    schedule 13.08.2018
comment
Kompilasi baik-baik saja dengan jdk-9.0.4 dan jdk-10.0.2, tetapi tidak dengan jdk1.8.0_181. Juga dikompilasi dengan baik dengan kompiler Eclipse Photon, bahkan dalam mode kompatibilitas Java 8.   -  person Andreas    schedule 13.08.2018
comment
saat menggunakan kelas anonim alih-alih lambda berfungsi di 1.8.0_131   -  person Lino    schedule 13.08.2018
comment
@Deadpool Versi mana yang Anda gunakan?   -  person Dean Xu    schedule 13.08.2018
comment
@Andreas Jadi bisakah saya menganggapnya telah diperbaiki di jdk-9?   -  person Dean Xu    schedule 13.08.2018
comment
bagi saya java version "1.8.0_171" itu berhasil   -  person Deadpool    schedule 13.08.2018


Jawaban (1)


Ini adalah bug jdk yang telah diperbaiki 1.8.0_171 (mungkin bukan versi perbaikan terendah).

person Community    schedule 03.12.2018