1

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

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

所以我的问题是如何轻松找出是否需要传递该实例参数以及该参数是否强制?

我找到了一种方法来做到这一点:

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

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

4

1 回答 1

1

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

val isInstanceCallable = callable.instanceParameter != null

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


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

val instance = (callable as CallableReference).boundReceiver

当可调用引用未绑定时,它将返回一个特殊值CallableReference.NO_RECEIVER,因此您只需将返回的值与它进行比较:

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

(可运行示例)

于 2017-05-06T22:06:27.083 回答