是否可以作为内联lambda参数接收具有 guaranteed return type R but a variable number of arguments 的函数类型?为简单起见,请考虑以下事项:
inline fun <R> Boolean?.tfn(tru:()->R, fls:()->R, nul:()->R) =
if (this == null) nul() else if (this) tru() else fls()
假设我有 other inline functions that also take lambda parameters ,其类型可能是 (A)->R
或 (A,B)->R
或 (A,B,C)->R
,其参数我想传递给此函数 . 它们都将提供 R
但是必须调用它们以获取 R
,而不知道此函数中参数的数量/类型/值 . 有没有办法一般修改上面的函数:
-
捕获任何lambda参数的一般情况,为其输入返回
R
-
避免对将调用此函数的其他内联函数进行任何更改
-
保持内联效率
1 回答
这是不可能的
Kotlin使用静态的强类型,编译器需要在编译时知道lambda参数的确切类型 . 内部lambdas实际上是
kotlin.jvm.functions
接口之一(对于JVM或Android)的实现,如下所示:这些接口定义了参数的确切数量及其类型 . 因此,不可能在Kotlin中创建一个
vararg
lambda . 这当然与JVM中的vararg
只是内部使用普通数组的语法糖这一事实有关,但它本身不是类型系统构造,因此您不能像处理类型一样处理类型 .依赖类型
解决问题的一个建议是使用
Array
或Collection
作为函数参数,或传递任意Function<R>
,但此解决方案的限制方式是无法静态强制执行相同数量的参数 . 传递函数,因为类型系统本身不知道集合/数组的大小或Function<R>
的参数计数 .要完全解决您的问题,您需要一种具有dependent type系统的语言 .