我正在嘗試執行以下操作:
class Event<TPayload>() {
fun subscribe(handler: (payload: TPayload) -> Unit) { ... }
fun subscribe(handler: () -> Unit) where TPayload : Unit { ... }
}
目的是 的實體Event<Unit>將有兩個 的多載subscribe(),但其他實體只有一個。
上面的代碼不會編譯。我嘗試使用擴展方法,但必須為額外方法使用不同的名稱,而不是多載它。
uj5u.com熱心網友回復:
您可以將第二個函式定義為擴展函式,以便它只出現在具有 Unit 型別的事件中。可以多載函式名。在類之外定義它:
inline fun Event<Unit>.subscribe(crossinline handler: ()->Unit) =
subscribe { handler() }
測驗:
class Event<T> {
private val subscribers = mutableListOf<(T)->Unit>()
fun subscribe(handler: (payload: T) -> Unit) {
subscribers = handler
}
fun send(payload: T) {
for (subscriber in subscribers) subscriber(payload)
}
}
fun main() {
val event = Event<Unit>()
// Using verbose syntax to prove it's the extension function being used
// and not a lambda with implicit 'it':
event.subscribe(fun() { println("got unit") })
event.send(Unit)
}
如果您使用 lambda,編譯器將使用subscribe帶有隱式it引數的第一個函式,因為它在多載決議中具有優先權。但是,如果您不使用該引數,則運行時行為將是相同的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/511725.html
