Tôi đã tò mò tại sao một lambda với kiểu trả về không thể được đúc thành một Runnable
trong khi tham chiếu phương thức không trống có thể.Quy tắc đúc Lambda
Runnable r1 =() -> 1; // not allowed
// error: incompatible types: bad return type in lambda expression
// int cannot be converted to void
Runnable r2 = ((Supplier)() -> 1)::get; // allowed
Bạn có thể chỉ ra nơi trong JLS được đề cập rằng, trong trường hợp đó, "phần sau mũi tên' -> 'phải là _statement_"? Tôi đang tìm kiếm nó. – Tunaki
@Tunaki Tìm thấy nó, đó là [§15.27.3] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.3). – RealSkeptic
@RealSkeptic Ha hoàn toàn thực sự: * Nếu kết quả của kiểu hàm bị vô hiệu, phần tử lambda là biểu thức câu lệnh (§14.8) hoặc khối tương thích void. * Và biểu thức chính không phải là biểu thức câu lệnh (và isn ' t một khối). – Tunaki