Kotlin 检查函数是否需要实例参数

Kotlin check if function requires instance parameter

如果 KCallable 是使用 Any()::toString 创建的,那么当稍后引用它时,您不需要传递那个 Any 实例(当使用 call 时)。

虽然如果它是使用 Any::toString 创建的(不是 Any 的实例),则需要传递 Any 实例。

所以我的问题是如何轻松地确定我是否需要传递该实例参数以及该参数是必需的吗?

我找到了一种方法:

callable.parameters[0].kind == KParameter.Kind.INSTANCE

但这不是很好,我想知道是否有更简单或推荐的方法来解决这个问题。谢谢!

您建议的改进方法是检查 instanceParameter 属性:如果它不为空,则可调用对象需要一个实例:

val isInstanceCallable = callable.instanceParameter != null

此外,像 fun Any.foo() = ... 这样的扩展函数在 instanceParameter 中将有 null,您可能还想检查 extensionReceiverParameter


此外,如果您只需要使用可调用引用,您可以检查它们是否有绑定的接收者(即它绑定到的实例)。使用 boundReceiver 属性:

val instance = (callable as CallableReference).boundReceiver

当可调用引用未绑定时,它将return一个特殊值CallableReference.NO_RECEIVER,因此您只需要将returned 值与其进行比较即可:

val bound = (callable as CallableReference).boundReceiver != CallableReference.NO_RECEIVER

(runnable example)