Cố gắng thực hiện các mã tương tự như tìm thấy trong ví dụ bậc-chức năng cao hơn từ http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6Scala ActionListener/loại chức năng ẩn danh không phù hợp
val button = new JButton("test")
button.addActionListener{ e:ActionEvent => println("test") }
add(button)
dẫn đến những điều sau
error: type mismatch;
found : (java.awt.event.ActionEvent) => Unit
required: java.awt.event.ActionListener
button.addActionListener{ e:ActionEvent => println("test") }
^
Điều này đúng ở ít nhất là với trình biên dịch Scala phiên bản 2.7.6.final trên hệ thống của tôi. Tôi có thể đạt được những gì tôi muốn theo cách thức kiểu Java của việc triển khai một cách rõ ràng một ActionListener ẩn danh.
button.addActionListener(new ActionListener() {
def actionPerformed(e:ActionEvent) { println("test") }
})
Theo tôi hiểu, Scala sẽ có thể sử dụng kiểu gõ vịt để hiển thị việc triển khai ActionListener rõ ràng không cần thiết; vậy tại sao nó không hoạt động ở đây? Tôi đã không có kinh nghiệm thực tế của vịt gõ vào thời điểm này.
Không phải là chủ nghĩa cuồng tín, nhưng đáng chú ý là cả Groovy và các đề xuất đóng cửa Java khác nhau đều bao gồm các chuyển đổi ngầm từ các kiểu hàm thích hợp sang các giao diện phương thức đơn. Điều này rất thuận tiện cho các giao diện như Runnable hoặc Comparable. Trong Scala, bạn cần phải thực hiện chuyển đổi này bằng tay, hoặc dựa vào các thư viện pimped để thực hiện nó. –
@Dave Có ... nếu loại không khớp, hãy tự động truyền. Tôi nghĩ rõ ràng là tại sao Scala không chọn cách này. –
Ồ, chắc chắn rồi. Nó chỉ có ý nghĩa đối với Groovy và Java vì chúng không bao gồm bất kỳ cách nào tốt để mở rộng các thư viện hiện có, vì vậy chúng cần chuyển đổi tự động này để làm việc với Java kế thừa không đau đớn. Scala có các thư viện cho các thư viện cũ, và các thư viện mới nên được (và đang được) viết để ủng hộ các biểu mẫu chức năng trên các giao diện một phương thức. –