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)
}

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)
添加回答
舉報