Kotlin检查函数是否需要实例参数
如果一个KCallable
是使用Any()::toString
创建的,那么当它被引用时,你不需要传递Any
实例(当使用call
)。
虽然如果它是使用Any::toString
(不是Any
一个实例)创建的,它需要传递一个Any
实例。
所以我的问题是如何轻松地找出是否需要传递该实例参数,并且此参数是必需的?
我find了一个方法来做到这一点:
callable.parameters[0].kind == KParameter.Kind.INSTANCE
但它不是很好,我想知道是否有一个更容易或推荐的方法来解决这个问题。 谢谢!
你提出的方法的一个改进是检查instanceParameter
属性:如果它不是null,那么可调用期望一个实例:
val isInstanceCallable = callable.instanceParameter != null
另外, fun Any.foo() = ...
这样的扩展函数在instanceParameter
会有null,你也可能想检查extensionReceiverParameter
。
另外,如果您只需要使用可调用的引用,就可以检查它们是否有绑定的接收者(即绑定的实例)。 使用boundReceiver
属性:
val instance = (callable as CallableReference).boundReceiver
当可调用的引用被解除绑定时,它将返回一个特殊的值CallableReference.NO_RECEIVER
,因此您只需要将返回的值与它进行比较:
val bound = (callable as CallableReference).boundReceiver != CallableReference.NO_RECEIVER
(可运行的例子)