Pracuję nad GUI w Vaadin, z niektórymi zajęciami z mojego szefa IT. To wszystko jest świetne i to, ale dzisiaj napotkałem, że nie mogę użyć wyrażenia lambda w typie metody addListener
. Ta metoda jest niestandardowa, jako obiekt, który jej używa. Oto realizacja:Dlaczego funkcja lambda jest tutaj zabroniona?
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();
}
Aby używać tego rozszerzenia należy to zrobić:
ResetButtonForTextField rb=ResetButtonForTextField.extend(button);
rb.addResetButtonClickedListener(new ResetButtonClickListener() {
@Override
public void resetButtonClicked() {
//Do some stuff here
}
});
Jeśli używam lambda w addResetButtonClickedListener
tak:
rb.addResetButtonClickedListener(ev -> {
//Do some magic here
}
Kompilator mówi, że
podpis
Lambda Expression za nie pasuje do podpisu funkcjonalnej metody interfejsu resetButtonClicked()
Metoda addResetButtonClickedListener (ResetButtonClickListener) w typie ResetButtonForTextField nie dotyczy argumentów ((EV) -> {})
Nawet gdybym definiować wyrażenia lambda tak: (ResetButtonClickListener ev) -> {}
nadal daje błąd.
Pytanie brzmi: Dlaczego nie mogę użyć wyrażenia lambda? Brakuje mi czegoś w deklaracji kodu?
Och, mam acostummed do '' ButtonClickListeners' z klasy Button', że przyjmować jeden argument zdarzenia. Nie myślałem o tym. Dziękuję Ci! – Shirkam