Trong java 8, một lớp trừu tượng chỉ có một phương thức trừu tượng không phải là giao diện chức năng (JSR 335).Lớp trừu tượng làm giao diện chức năng
interface
Đây là một giao diện chức năng:
public interface MyFunctionalInterface {
public abstract void myAbstractMethod();
public default void method() {
myAbstractMethod();
}
}
nhưng abstract class
đây không phải là:
public abstract class MyFunctionalAbstractClass {
public abstract void myAbstractMethod();
public void method() {
myAbstractMethod();
}
}
Vì vậy, tôi không thể sử dụng lớp trừu tượng như một mục tiêu cho một biểu thức lambda và tham khảo phương pháp .
public class Lambdas {
public static void main(String[] args) {
MyFunctionalAbstractClass functionalAbstractClass =() -> {};
}
}
Lỗi biên dịch là: The target type of this expression must be a functional interface
.
Tại sao các nhà thiết kế ngôn ngữ áp đặt hạn chế này?
Câu hỏi hay ... khả năng tương thích có thể? – Mena
Điều này đã được yêu cầu và trả lời trước đây ... lý do chính là tính linh hoạt trong tương lai, nơi mà lambdas được dự kiến sẽ rất khác với các phiên bản lớp. –
Ở đây, đọc nó [từ miệng ngựa] (http://mail.openjdk.java.net/pipermail/lambda-dev/2013-March/008441.html). –