2017-09-29 27 views
5

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ã?

Trả lời

11

Giao diện chức năng bao gồm các phương pháp

public void resetButtonClicked() 

không có tham số. Lambda của bạn cố gắng thực hiện nó với một tham số kiểu ResetButtonClickListener. Những gì bạn muốn làm là

rb.addResetButtonClickedListener(() -> { 
    // handling code goes here 
}); 
+0

Ồ, 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

3

Nguyên nhân của lỗi này là rõ ràng trong msg

Phương pháp addResetButtonClickedListener (ResetButtonClickListener) trong các loại ResetButtonForTextField không áp dụng cho các đối số ((ev) - > {})

nên bạn không thể sử dụng lambda đề cập đến một đối tượng ev vì phương pháp resetButtonClicked của giao diện ResetButtonClickListener không mất bất kỳ thông số ...

làm:

ResetButtonForTextField r = .... 
r.addResetButtonClickedListener(() -> { 
    //TODO 
}); 
Các vấn đề liên quan