2017-09-29 30 views
5

Vaadin’de, BT yöneticim tarafından verilen bazı sınıflarla bir GUI etrafında çalışıyorum. Hepsi harika, ama bugün, ben bir addListener yöntem türünde bir lambda ifadesi kullanamadığımı gördüm. Bu yöntem, onu kullanan nesne olarak özeldir. Böyle addResetButtonClickedListener bir lambda kullanırsanızLambda işlevi burada neden izinli değil?

ResetButtonForTextField rb=ResetButtonForTextField.extend(button); 
rb.addResetButtonClickedListener(new ResetButtonClickListener() { 
    @Override 
    public void resetButtonClicked() { 
     //Do some stuff here 
    } 
}); 

:

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(); 
} 

bunu yapmalısınız Bu uzantıyı kullanmak için:

rb.addResetButtonClickedListener(ev -> { 
    //Do some magic here 
} 

derleyici

söylüyor İşte uygulamasıdır
    Fonksiyonel arabirim yöntemi imzaya sahip
  • lambda ifade imzası resetButtonClicked()

  • tipi ResetButtonForTextField yöntemi addResetButtonClickedListener (ResetButtonClickListener) bağımsız değişken ((EV) -> {}) için geçerli değildir

böyle lambda ifade tanımlamak bile: (ResetButtonClickListener ev) -> {} hala hata veriyor.

Soru şu ki, neden orada bir lambda ifadesi kullanamıyorum? Kodun ilanında bir şey eksik miyim?

cevap

11

işlevsel arayüz yöntemi herhangi bir parametre ile

public void resetButtonClicked() 

oluşur. Lambda, bunu ResetButtonClickListener türünde bir parametre ile uygulamaya çalışır. Ne yapmak istediğiniz

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

Oh, bir olay argüman alabilir Button' sınıfının 'arasında ButtonClickListeners',' etmek acostummed gördü. Bunu düşünmedim. Teşekkür ederim! – Shirkam

3

hatasının nedeni msg tipi ResetButtonForTextField yöntemi addResetButtonClickedListener (ResetButtonClickListener) argümanlar ((ev) için geçerli değildir

açık olduğu - > {}) arabirimi ResetButtonClickListener yöntem resetButtonClicked değildir, çünkü

böylece bir nesneye EV atıfta lambda kullanamaz

do ... herhangi bir parametre almak:

ResetButtonForTextField r = .... 
r.addResetButtonClickedListener(() -> { 
    //TODO 
}); 
İlgili konular