tôi học tính năng mới của Java 8.Java 8 có thể triển khai giao diện trực tiếp để tham khảo phương pháp không?
tôi đang chơi với các ví dụ khác nhau và tôi đã tìm thấy một hành vi kỳ lạ:
public static void main(String[] args) {
method(Test::new);
}
static class Test{
}
private static void method(Supplier<Test> testSupplier){
Test test = testSupplier.get();
}
Mã này biên dịch thành công nhưng tôi không có ý tưởng như thế nào nó hoạt động.
Tại sao Test::new
được chấp nhận làm Nhà cung cấp?
giao diện Nhà cung cấp trông rất đơn giản:
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Để tự động triển khai loại AFAIK nào có con thú này: ['java.lang.invoke.LambdaMetafactory'] (https://docs.oracle.com/javase/8/docs/api/java/lang/ Gọi/LambdaMetafactory.html) – zapl
Lưu ý rằng một khai báo lớp "rỗng", chẳng hạn như cho 'lớp Test' của bạn, ngầm có một hàm tạo no-arg. Đó là lý do tại sao bạn có thể viết 'new Test()' và có nó hoạt động, bất kỳ lý do tại sao một lambda hoặc phương thức tham chiếu đến constructor này hoạt động. –
@Sotirios Delimanolis có lẽ bình luận đầu tiên cho câu hỏi được liên kết là phù hợp hơn – gstackoverflow