Tôi đã làm việc arround GUI trong Vaadin, với một số lớp học nhất định từ giám đốc CNTT của tôi. Đó là tất cả tuyệt vời và đó, nhưng, hôm nay, tôi đã gặp phải rằng tôi không thể sử dụng một biểu thức lambda trong một loại phương thức addListener
. Phương thức này là tùy chỉnh, là đối tượng sử dụng nó. Đây là việc thực hiện:Tại sao hàm lambda không được phép ở đây?
public class ResetButtonForTextField extends AbstractExtension {
private final List<ResetButtonClickListener> listeners
= new ArrayList<ResetButtonClickListener>();
private void addResetButtonClickedListener
(ResetButtonClickListener listener) {
listeners.add(listener);
}
//Some other methods and the call of the listeners
}
public interface ResetButtonClickListener extends Serializable {
public void resetButtonClicked();
}
Để sử dụng phần mở rộng này, bạn phải làm điều này:
ResetButtonForTextField rb=ResetButtonForTextField.extend(button);
rb.addResetButtonClickedListener(new ResetButtonClickListener() {
@Override
public void resetButtonClicked() {
//Do some stuff here
}
});
Nếu tôi sử dụng một lambda trong addResetButtonClickedListener
như thế này:
rb.addResetButtonClickedListener(ev -> {
//Do some magic here
}
Trình biên dịch nói rằng
chữ ký
Lambda biểu hiện của không khớp với chữ ký của phương pháp giao diện chức năng resetButtonClicked()
Phương pháp addResetButtonClickedListener (ResetButtonClickListener) trong các loại ResetButtonForTextField không áp dụng cho các đối số ((ev) -> {})
Thậm chí nếu tôi xác định biểu thức lambda như thế này: (ResetButtonClickListener ev) -> {}
vẫn đưa ra lỗi.
Vì vậy, câu hỏi là, Tại sao tôi không thể sử dụng biểu thức lambda ở đó? Tôi đang thiếu một cái gì đó trong việc khai báo mã?
Ồ, tôi đã acostummed cho 'ButtonClickListeners' của lớp' Button', mà phải mất một đối số sự kiện. Tôi không nghĩ về điều đó. Cảm ơn bạn! – Shirkam