เพื่อป้องกันไม่ให้ปิดซ้ำ คำถามนี้แตกต่างอย่างสิ้นเชิงกับ อันนี้.
พิจารณาว่าฉันมีอินเทอร์เฟซต่อไปนี้
@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;
}
ด้วยการใช้งานแบบเดียวกัน Complier ให้ข้อผิดพลาดต่อไปนี้แก่ฉัน
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 จะทำงาน
จะเกิดอะไรขึ้นเมื่อฉันแทนที่ข้อยกเว้นที่เกิดขึ้น นี่เป็นข้อผิดพลาดของ Java หรือไม่
ฉันใช้ 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;
}
}
java version "1.8.0_171"
มันได้ผล - person Deadpool   schedule 13.08.2018