我想写一个这个java代码的groovy版本:
class HelloWorld {
static main(args) {
def server = Server.builder()
.setHandler(new HttpHandler() {
public void handle(final Ev ev){
ev.dispatch(this)
}
}
}).build()
server.start()
}
}
我得到的groovy代码是:
class HelloWorld {
static main(args) {
def server = Server.builder()
.setHandler(new HttpHandler() {
public void handle(final Ev ev){
ev.dispatch(this)
}
}
}).build()
server.start()
}
}
问题来自ev.dispatch(this):ev.dispatch需要一个HttpHandler对象但是"这个"在groovy中,即使是类型转换,也不会产生HttpHandler对象。
我试过替换"这个"与"委托"或"所有者"但没有改变。
我试图用一个闭包替换anonim内部类,但没有不同的esit:
class HelloWorld {
static main(args) {
def server = Server.builder()
.setHandler({ ev ->
public void handle(final Ev ev){
ev.dispatch(this)
}
} as HttpHandler
).build()
server.start()
}
}
有什么建议吗? (使用groovy 2.3.6)
答案 0 :(得分:1)
以下有两个问题:
class HelloWorld {
static main(args) {
def server = Server.builder()
.setHandler(new HttpHandler() {
public void handle(final Ev ev){
ev.dispatch(this)
}
}
}).build()
server.start()
}
}
一个是匿名内部类定义中不匹配的花括号。当应该只有2个时,连续3个花括号(})。
另一个似乎是Groovy中的一个错误。请参阅https://jira.codehaus.org/browse/GROOVY-7020。
答案 1 :(得分:0)
在Groovy中,封闭内的this
, owner
and delegate
usually mean the same thing。
Groovy(具有讽刺意味?)并不允许您通过关键字匿名引用匿名闭包。您必须在所有者的范围内命名闭包,然后您可以通过该名称引用它。如果您将其声明为所有者中的字段,那么您应该能够直接自引用,但在这种情况下,您可以在静态方法中声明它,这样可能无法正常工作。相反,您只需设置handler.delegate = handler
,然后在闭包内使用delegate
进行自我引用。
另外,我不认为你应该在闭包中声明一个方法 - 你只需要直接编写代码。我想这就是你想要的:
class HelloWorld {
static main(args) {
def handler = { ev ->
ev.dispatch(delegate)
} as HttpHandler
handler.delegate = handler
def server = Server.builder()
.setHandler(handler).build()
server.start()
}
}
这样可以解决使用闭包应该给你的一些简洁,但显然这就是你所坚持的。