我怎样才能把KFunction没有实例参数的KFunction?

class X { fun someFunc(x: Int, y: String, z: Double) { println("x = [$x], y = [$y], z = [$z]") } } fun main(args: Array<String>) { val func = X::someFunc val instance = X() func.call(instance, 1, "Hi", 123.45) } 

鉴于上面的代码,我怎样才能将它转换为实例内置的函数,所以当调用我可以只传递参数没有instance(我可以只使用X()::someFunc但这不是这个问题的重点)

你可以实现一个包装这个逻辑的委托。 示例实现:

 class KCallableWithInstance<out T>(private val func: KCallable<T>, private val instance: Any) : KCallable<T> by func { private val instanceParam = func.instanceParameter ?: func.extensionReceiverParameter ?: throw IllegalArgumentException("Given function must not have a instance already bound") init { val instanceParamType = instanceParam.type.jvmErasure if (!instance::class.isSubclassOf(instanceParamType)) throw IllegalArgumentException( "Provided instance (${instance::class.qualifiedName}) isn't an subclass of " + "instance param's value's class (${instanceParamType::class.qualifiedName})") } override fun call(vararg args: Any?): T = func.call(instance, *args) override fun callBy(args: Map<KParameter, Any?>): T = func.callBy(args + (instanceParam to instance)) override val parameters = func.parameters.filter { it != instanceParam } } fun <T> KCallable<T>.withInstance(instance: Any): KCallable<T> = KCallableWithInstance(this, instance) 

然后像这样使用它(例如基于代码的问题): func.withInstance(instance).call(1, "Hi", 123.45)