我有一些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达到相同的结果。
答案 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)]