在Java中,我們可以做到這一點 Events.handler(Handshake.class, hs -> out.println(hs));
Kotlin:使用lambda代替功能界面?
在科特林但是我試圖複製的行爲來取代這個:
Events.handler(Handshake::class, object : EventHandler<Handshake> {
override fun handle(event: Handshake) {
println(event.sent)
}
})
提供了更便利:
Events.handler(Handshake::class, EventHandler<Handshake> { println(it.sent) })
對於某些原因參考EventHandler
:
更優選的,但是我想使用的東西更短這樣的: Events.handler(Handshake::class, { println(it.sent) })
或者用通告的功能,使用這樣的方法: Events.handler(Handshake::class) { println(it.sent) }
這是我Events
對象:
import java.util.*
import kotlin.reflect.KClass
object Events {
private val map = HashMap<Class<*>, Set<EventHandler<*>>>()
fun <T : Any> handler(eventType: KClass<T>, handler: EventHandler<T>) {
handler(eventType.java, handler)
}
fun <T> handler(eventType: Class<T>, handler: EventHandler<T>) = handlers(eventType).add(handler)
fun post(event: Any) = handlers(event.javaClass).forEach { it.handle(event) }
operator fun plus(event: Any) = post(event)
private fun <T> handlers(eventType: Class<T>): HashSet<EventHandler<T>> {
var set = map[eventType]
if (set == null) {
set = HashSet<EventHandler<*>>()
map.put(eventType, set)
}
return set as HashSet<EventHandler<T>>
}
}
而我的EventHandler
接口:
@FunctionalInterface
interface EventHandler<T> {
fun handle(event: T)
}
您是否爲第一個參數嘗試了'Handshake :: class.java'?無論如何,請嘗試按Ctrl + P查看該函數的可能參數。 –
'Events.handler(Handshake :: class){println(it.sent)}' - 此語法與內聯函數無關 –
OP不理解內聯函數的含義。 –