【问题标题】:Why is lambda function not allowed here?为什么这里不允许使用 lambda 函数?
【发布时间】:2017-09-29 07:30:16
【问题描述】:

我一直在围绕 Vaadin 的 GUI 工作,我的 IT 主管提供了一些课程。这一切都很好,但是,今天,我遇到了我不能在 addListener 方法类型中使用 lambda 表达式。此方法是自定义的,作为使用它的对象。这是实现:

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

要使用此扩展程序,您必须这样做:

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

如果我像这样在addResetButtonClickedListener 中使用 lambda:

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

编译器这样说

  • Lambda 表达式的签名与函数式接口方​​法 resetButtonClicked() 的签名不匹配

  • ResetButtonForTextField 类型中的方法 addResetButtonClickedListener(ResetButtonClickListener) 不适用于参数 ((ev) -> {})

即使我这样定义 lambda 表达式:(ResetButtonClickListener ev) -&gt; {} 仍然会报错。

所以问题是,为什么我不能在那里使用 lambda 表达式?我在代码声明中遗漏了什么?

【问题讨论】:

    标签: java lambda vaadin


    【解决方案1】:

    功能接口由方法组成

    public void resetButtonClicked()
    

    没有参数。您的 lambda 尝试使用 ResetButtonClickListener 类型的参数来实现它。你想做的是

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

    【讨论】:

    • 哦,我得到了Button 类的ButtonClickListeners 的服装,这需要一个事件参数。我没想到。谢谢!
    【解决方案2】:

    错误原因在消息中很清楚

    ResetButtonForTextField 类型中的方法 addResetButtonClickedListener(ResetButtonClickListener) 不适用于参数 ((ev) -> {})

    所以你不能使用引用对象 ev 的 lambda,因为接口 ResetButtonClickListener 的方法 resetButtonClicked 不带任何参数...

    做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多