2014-04-01 37 views
9

Tôi đang gặp khó khăn trong việc phân loại lý do tại sao các biểu thức lambda được gán cho một số giao diện chức năng, nhưng không thể gán cho các giao diện khác. Một ví dụ, sử dụng một số giao diện chức năng từ Metrics library:Giao diện chức năng trong Java 8

Gauge<Double> foo =() -> { return null; }; 
RatioGauge bar =() -> { return null; }; 

Những tuyên bố thứ hai có một lỗi biên dịch (trong Eclipse):

Các loại mục tiêu của biểu thức này phải là một giao diện chức năng

Theo như tôi có thể biết, RatioGauge is a functional interface. Tui bỏ lỡ điều gì vậy?

+0

Chức năng ** Giao diện **? –

+1

Tóm tắt ** lớp ** không phải là giao diện ** chức năng **. – m0skit0

Trả lời

22

Lớp trừu tượng (ngay cả khi nó chỉ có một phương thức trừu tượng) không phải là giao diện chức năng. Chỉ có một giao diện có thể là một.

Từ JLS 9.8:

Một giao diện chức năng là một giao diện rằng chỉ có một phương pháp trừu tượng (ngoài các phương pháp của đối tượng) ... (nhấn mạnh thêm)

Bản gốc ý tưởng để cho các lớp abstact được thể hiện dưới dạng lambda; chúng được gọi là "loại SAM", viết tắt của "phương pháp trừu tượng duy nhất". Điều đó hóa ra lại là một vấn đề khó giải quyết một cách hiệu quả. This thread nói một chút về lý do; về cơ bản, constructor của lớp cơ sở đã gây khó khăn cho nó.

+1

Đó là một sự xấu hổ thực sự vì các biểu thức lambda về cơ bản được dự định để thay thế các lớp ẩn danh và người ta có thể tạo một lớp ẩn danh từ một giao diện hoặc một lớp trừu tượng. –

+4

@ JoshStone Vâng, các biểu thức lambda không bao giờ có ý định thay thế hoàn toàn các lớp Anonymous, nhưng chỉ cho một số trường hợp nhất định. –

+0

@RohitJain Có cách giải quyết nào mà lambda có thể được sử dụng kết hợp với một lớp trừu tượng (với một phương thức trừu tượng đơn lẻ) không? –

0

Giao diện chức năng chỉ có thể có phương thức trừu tượng ONE (bên cạnh các phương thức từ lớp Đối tượng).

Mã nguồn cho Gauge.java code = http://grepcode.com/file/repo1.maven.org/maven2/com.codahale.metrics/metrics-core/3.0.0/com/codahale/metrics/Gauge.java#Gauge

Nguồn RatioGauge.java = http://grepcode.com/file/repo1.maven.org/maven2/com.codahale.metrics/metrics-core/3.0.0/com/codahale/metrics/RatioGauge.java

ý rằng Gauge.java chỉ có một phương pháp trừu tượng trong khi RatioGauge có nhiều phương pháp.

Các vấn đề liên quan