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>
)将具有自己的类型参数(Int
和 Unit
在这种情况下),并且您想将 args
参数声明为具有这些确切类型的不确定数量的参数(不包括最后一个,它表示函数调用结果的类型)?
我相信这是不可能的。
您最好将 args
声明为 vararg
,Any?
类型:
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))
}
我有一个 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>
)将具有自己的类型参数(Int
和 Unit
在这种情况下),并且您想将 args
参数声明为具有这些确切类型的不确定数量的参数(不包括最后一个,它表示函数调用结果的类型)?
我相信这是不可能的。
您最好将 args
声明为 vararg
,Any?
类型:
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))
}