亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 lambda 函數中獲取接口引用

在 lambda 函數中獲取接口引用

神不在的星期二 2021-07-20 17:08:30
考慮以下代碼:val hwnd = Handler()hwnd.postDelayed(object : Runnable {        override fun run()            hwnd.postDelayed(this, 5000)        }}, 5000)這樣,我可以通過this在run()方法中使用(指的是 Runnable)將相同的 Runnable 發布到 Handler 。但是我怎么能只使用一個 lambda 表達式來做同樣的事情呢?val hwnd = Handler()hwnd.postDelayed({    //How to get "this" here?}, 5000)這甚至可能嗎?
查看完整描述

2 回答

?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

由于默認的 lambda 轉換為您提供了簽名為 的 lambda () -> Unit,這意味著底層Runnable是完全隱藏的。


您必須處理手動對象創建,或者編寫一個包裝擴展函數,該函數將使用具有另一個簽名的 lambda:


// custom extension function for handler

inline fun Handler.postDelayed(delayMilis: Long, crossinline runnable: (Runnable) -> Unit) = postDelayed(object : Runnable{

    override fun run() {

        runnable(this)

    }

}, delayMilis)

然后在調用方,您將獲得Runnable對象作為 lambda 參數(僅參數:)it:


hwnd.postDelayed(5000){ 

    // it : Runnable

    hwnd.postDelayed(it, 5000)

}

或者,如果您真的想變得更花哨,請將擴展參數更改為Handler.(Runnable) -> Unit,然后您將能夠調用:


hwnd.postDelayed(5000){ 

    // this : Handler, it : Runnable

    postDelayed(it, 5000)

}


查看完整回答
反對 回復 2021-07-29
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

這是不可能的。你可以參考這個討論:“這個”在 SAM 中是否可以訪問?


this在 lambda 中是指包含類的實例,如果有的話。lambda 在概念上是一個函數,而不是一個類,因此不存在this可以引用的 lambda 實例之類的東西。


可以將 lambda 轉換為 SAM 接口的實例這一事實不會改變這一點。有this一個拉姆達取決于是否拉姆達意味著不同的事情變得SAM-轉換會非?;靵y。


您可以創建一個解決方法(例如在討論中建議):創建一個擴展函數:


inline fun runnable(crossinline body: Runnable.() -> Unit) = object : Runnable {

    override fun run() = body()

}

那么你可以這樣稱呼它


hwnd.postDelayed(runnable { hwnd.postDelayed(this, 5000) }, 5000)


查看完整回答
反對 回復 2021-07-29
  • 2 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號