【发布时间】:2014-08-10 21:47:01
【问题描述】:
我想写一个 groovy 版本的这个 java 代码:
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 中的“this”,即使是类型转换,也不会产生 HttpHandler 对象。
我尝试将“this”替换为“delegate”或“owner”,但没有任何改变。
我尝试用闭包替换 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)
【问题讨论】:
-
"...但在 groovy 版本中,这指的是 HelloWorld 外部对象。" - 这几乎是不可能的。在您的示例中没有创建 HelloWorld 的实例。你确定这就是
this所指的吗? -
它是指作为 HelloWorld 实例的对象,还是评估 HelloWorld 类(就像 HelloWord.class 一样)?
-
我已经运行了描述中发布的第一个 Groovy 示例(在修复了不匹配的花括号之后),
this不是指HelloWorld的实例,this指的是HelloWorld$1,这是一个匿名内部类,它是HttpHandler的一个实例,this应该在那里引用。 -
@JeffScottBrown 你是对的 println "this" 与 HelloWorld$1 相呼应。但是,如果我尝试将其强制转换为 HttpHandler,我会收到此异常:无法将具有类 'java.lang.Class' 的对象 'class mypkg.Underdog$1' 强制转换为类 'mypkg.HttpHandler'
-
您确实应该更改“但在 groovy 版本中这指的是 HelloWorld 外部对象”的措辞,因为您让人们花费(浪费)他们的时间来调查没有发生的事情。我会自己编辑它,但我认为政策是编辑其他人的问题不应该改变问题的意图。
标签: java groovy closures inner-classes anonymous-class