Tôi đang phát triển một ứng dụng JavaFX8 trong Scala nhưng tôi không thể tìm ra cách chuyển một tham chiếu phương thức tới một trình xử lý sự kiện. Để làm rõ, tôi không sử dụng thư viện ScalaFX nhưng xây dựng ứng dụng của tôi trực tiếp trên đầu trang của JavaFX.Có thể sử dụng tham chiếu phương thức kiểu Java 8 trong Scala không?
Đây là đoạn mã liên quan.
InputController.java (tôi đã viết lớp thử nghiệm này trong Java để cô lập các vấn đề tiêu thụ một tài liệu tham khảo phương pháp duy nhất)
public class InputController {
public void handleFileSelection(ActionEvent actionEvent){
//event handling code
}
public InputController() {
//init controller
}
}
này hoạt động (Java)
InputController inputController = new InputController();
fileButton.setOnAction(inputController::handleFileSelection);
Điều này không hoạt động (Scala)
val inputController = new InputController
fileButton.setOnAction(inputController::handleFileSelection)
Đây là thông báo lỗi từ trình biên dịch (Scala 2.11.6).
Error:(125, 45) missing arguments for method handleFileSelection in class Main;
follow this method with '_' if you want to treat it as a partially applied function
fileButton.setOnAction(inputController::handleFileSelection)
^
Nếu tôi sử dụng Scala 2.12.0-M2 thay vào đó, tôi nhận được thông báo lỗi khác.
Error:(125, 45) missing argument list for method handleFileSelection in class Main
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `handleFileSelection _` or `handleFileSelection(_)` instead of `handleFileSelection`.
fileButton.setOnAction(inputController::handleFileSelection)
^
Có cách nào để Scala có thể tận dụng các tham chiếu phương pháp được giới thiệu trong Java 8 không? Tôi biết về cách tiếp cận chuyển đổi tiềm ẩn để sử dụng một biểu thức lambda nhưng tôi muốn biết nếu có một cách để sử dụng một tham chiếu phương thức tương tự như Java 8 mà không cần sử dụng giải mã lambda.
Lưu ý: Java không có tham chiếu phương thức. Bạn có thể có một đối tượng có một phương thức gọi phương thức khác (đó là những gì lambdas thực sự làm) –
Tôi nghĩ rằng tôi đang nhầm lẫn với bình luận của bạn "Java không có tham chiếu phương thức". Tôi nghĩ rằng những gì tôi đang cố gắng làm là không có gì khác hơn so với ví dụ CompareProvider trong tài liệu chính thức (liên kết: https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html). – Mustafa
Câu hỏi này về cơ bản là một bản sao của http://stackoverflow.com/questions/24369449/ trong ngắn hạn, bạn có thể tạo một chuyển đổi ngầm từ (T) => Đơn vị thành EventHandler [T] và nhập khẩu ngầm định. –