将方法作为Java方法的参数传递

时间:2018-07-14 12:29:57

标签: xtend

我有一些Java代码想要转换为Xtend。 Java代码是:

public void createPartControl(Composite parent) {
    final Canvas clock = new Canvas(parent, SWT.None);
    clock.addPaintListener(this::drawClock);
}

private void drawClock(PaintEvent e) {
    e.gc.drawArc(e.x, e.y, e.width - 1, e.height - 1, 0, 360);
}

我尝试使用Xtend代码是:

override createPartControl(Composite parent) {
    val clock = new Canvas(parent, SWT.None);
    clock.addPaintListener(this::drawClock);
}

private def drawClock(PaintEvent e) {
    e.gc.drawArc(e.x, e.y, e.width - 1, e.height - 1, 0, 360);
}

问题是表达式this::drawClock在Xtend中无效。具体来说,它说this无法解析为类型。如何使用Xtend达到相同的结果。

1 个答案:

答案 0 :(得分:1)

Xtend不支持方法引用。您需要将要调用的方法包装在Xtend lambda中。

Java中的

this::drawClock(e) -> drawClock(e)在Xtend中变成[drawClock]。类型是自动推断的。

所以您可以写:

override createPartControl(Composite parent) {
    val clock = new Canvas(parent, SWT.None)
    clock.addPaintListener[drawClock]
}

侦听器的PaintEvent参数是lambda的隐式it参数。它自动用作drawClock的第一个参数。括号对于带有lambda参数的方法调用是可选的。

我会说符号addPaintListener[drawClock]是惯用语,但是您当然也可以写得更明确一些。所有这些都是等效的:

clock.addPaintListener[drawClock]
clock.addPaintListener([drawClock])
clock.addPaintListener([drawClock(it)])
clock.addPaintListener([e|drawClock(e)])
clock.addPaintListener([PaintEvent e| e.drawClock])

如果该方法具有多个参数,则可以将这些参数显式添加到lambda或使用隐式$1,$2,...,$n参数,例如:

component.addFooListener[e1, e2| onFoo(e1, e2)]
component.addFooListener[onFoo($1, $2)]