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
如果 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