Điểm mấu chốt là không có "loại chức năng" bằng Java. Một biểu thức lambda không có một "loại" của chính nó - nó có thể được gõ vào bất kỳ giao diện chức năng có chữ ký của phương thức duy nhất phù hợp với lambda. Do đó, kiểu lambda dựa trên kiểu được cung cấp bởi ngữ cảnh của nó. Bạn phải cung cấp một giao diện chức năng như bối cảnh cho nó để có được một loại.
Đó là hướng dẫn để xem xét cùng một vấn đề nhưng đối với các lớp ẩn danh. Mặc dù có sự khác biệt về triển khai giữa lambdas và các lớp ẩn danh, về mặt ngữ nghĩa, lambdas về cơ bản tương đương với một tập con của các lớp ẩn danh, và biểu thức lambda luôn có thể được chuyển thành biểu thức tạo lớp ẩn danh tương đương.
Khi bạn viết:
Function<T, Stream<T>> of_ref = Stream::of;
nó tương đương với một cái gì đó giống như sử dụng các lớp nặc danh sau:
Function<T, Stream<T>> of_ref = new Function<T, Stream<T>>() {
Stream<T> apply(T t) {
return Stream.of(t);
}
};
Bây giờ xem xét
Object of_ref = Stream::of;
tương đương với các lớp ẩn danh là gì ?
Object of_ref = new [**What goes here?**]() {
[**What method signature goes here?**] {
return Stream.of(t);
}
};
Bạn thấy tại sao điều đó không có ý nghĩa - chúng tôi không biết loại nào sẽ sử dụng làm lớp cơ sở của lớp ẩn danh.
Trong đoạn mã không thể nén đầu tiên của bạn, bạn mong đợi điều gì sẽ được lưu trữ trong 'of_ref'? Loại bê tông của cá thể được tham chiếu là gì? –