Kotlin 中的参数 KFunction

Parameters KFunction in Kotlin

我有一个 class 类型参数 KFunction<*> (据了解,我会注明我以后要合作的功能类型)

我想要一个 class 方法来获取与 KFunction 相同的参数,并使用这些参数调用订阅者。但是,我不知道如何获取函数参数的类型。 C#中有委托。如何在 Kotlin 中做这样的事情?

我的class:

class Event<Function: KFunction<*>> {
    val subscribers = mutableListOf<Function>()

    operator fun plus(increment: Function) {
        subscribers.add(increment)
    }

    // i want arguments as KFunction
    operator fun invoke(args: ???) {
        subscribers.forEach { it(args) }
    }
}

fun c(i: Int) {
    println("result of function c: $i")
}

fun main() {
    val event = Event<KFunction1<Int, Unit>>()
    event + ::c
    event(100) // passing arguments Int from KFunction1<Int, Unit>
}

有没有办法实现我的想法完全像这样

因此,这意味着作为 Function : KFunction<*> 类型参数传递的类型(在本例中为 KFunction1<Int, Unit>)将具有自己的类型参数(IntUnit在这种情况下),并且您想将 args 参数声明为具有这些确切类型的不确定数量的参数(不包括最后一个,它表示函数调用结果的类型)? 我相信这是不可能的。

您最好将 args 声明为 varargAny? 类型:

operator fun invoke(vararg args: Any?) = subscribers.forEach { it.call(*args) }

似乎唯一正常的解决问题的方法是只接受一种抽象类型的参数。

class Event<ArgsT> {
    private val subscribers = mutableListOf<(ArgsT) -> Any>()

    operator fun plusAssign(increment: (ArgsT) -> Any) {
        subscribers.add(increment)
    }

    operator fun invoke(params: ArgsT) {
        subscribers.forEach { it(params) }
    }
}

fun c(i: Int, b: Int) {
    println(i + b)
}

data class Data(val i: Int, val b: Int)

fun main() {
    val event = Event<Data>()
    event += { (i, b) -> c(i, b) } // pass arguments using a lambda
    event(Data(2, 5))
}