2017-09-29 14 views
5

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?

Odpowiedz

11

Interfejs czynnościowa składa się metodą

public void resetButtonClicked() 

bez parametrów. Twoja lambda próbuje ją zaimplementować za pomocą parametru typu ResetButtonClickListener. Co chcesz zrobić, to

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

Och, mam acostummed do '' ButtonClickListeners' z klasy Button', że przyjmować jeden argument zdarzenia. Nie myślałem o tym. Dziękuję Ci! – Shirkam

3

Przyczyną błędu jest jasne w MSG

Metoda addResetButtonClickedListener (ResetButtonClickListener) w typie ResetButtonForTextField nie dotyczy argumentów ((EV) - > {})

więc nie można użyć lambda odnoszące się do obiektu ev ponieważ metoda resetButtonClicked interfejsu ResetButtonClickListener nie wziąć dowolny parametr ...

zrobić:

ResetButtonForTextField r = .... 
r.addResetButtonClickedListener(() -> { 
    //TODO 
}); 
Powiązane problemy