[英]"This" in anonymous inner object
我想寫一個這個 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()
}
}
我得到的常規代碼是:
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)
以下有2個問題:
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 。
在 Groovy 中, this
、 owner
和delegate
在閉包中 通常意味着相同的事情。
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()
}
}
這消除了使用閉包應該給你的一些簡潔性,但顯然這就是你所堅持的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.