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
(可运行的例子)
- 用Kotlin将音频保存在Firebase上
- 如何在Kotlin中设置回调?
- 从Java转换到Kotlin时出错。 错误 – org.gradle.api.tasks.TaskExecutionException:任务执行失败:app:compileDebugKotlin'
- 在ArrayList中创建唯一项目的ArrayList
- 你如何为MediaPlayer声明一个全局变量?
- 构造函数使用可变参数在kotlin中调用
- 在CORDA中扩展Cash.State
- Android:工具栏不显示
- 什么是Iterable的行为#all&为什么Kotlin Char :: class.java!= char.javaClass