簡體   English   中英

匿名內部對象中的“this”

[英]"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 中, thisownerdelegate在閉包中 通常意味着相同的事情

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM