'วิธีการแทนที่ไม่ทำให้เกิดข้อยกเว้น' เมื่อใช้แลมบ์ดาโดยมีข้อยกเว้นการแทนที่ถูกโยนทิ้ง

เพื่อป้องกันไม่ให้ปิดซ้ำ คำถามนี้แตกต่างอย่างสิ้นเชิงกับ อันนี้.

พิจารณาว่าฉันมีอินเทอร์เฟซต่อไปนี้

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

person Dean Xu    schedule 13.08.2018    source แหล่งที่มา
comment
รหัสของคุณใช้งานได้สำหรับฉันโดยไม่มีปัญหาใด ๆ   -  person Deadpool    schedule 13.08.2018
comment
คอมไพล์ได้ดีกับ jdk-9.0.4 และ jdk-10.0.2 แต่ไม่ใช่กับ jdk1.8.0_181 คอมไพล์ได้ดีด้วยคอมไพเลอร์ Eclipse Photon แม้ในโหมดความเข้ากันได้ของ Java 8   -  person Andreas    schedule 13.08.2018
comment
เมื่อใช้คลาสที่ไม่ระบุชื่อแทนแลมบ์ดาทำงานใน 1.8.0_131   -  person Lino    schedule 13.08.2018
comment
@Deadpool คุณใช้เวอร์ชันไหน?   -  person Dean Xu    schedule 13.08.2018
comment
@Andreas ฉันสามารถพิจารณาว่ามันได้รับการแก้ไขใน jdk-9 หรือไม่?   -  person Dean Xu    schedule 13.08.2018
comment
สำหรับฉัน java version "1.8.0_171" มันได้ผล   -  person Deadpool    schedule 13.08.2018


คำตอบ (1)


นี่เป็นข้อผิดพลาด jdk ที่ได้รับการแก้ไขแล้ว 1.8.0_171 (อาจไม่ใช่เวอร์ชันแก้ไขต่ำสุด)

person Community    schedule 03.12.2018