是否可以接收具有保证返回类型R
但参数数量可变的函数类型作为内联 lambda 参数? 为简单起见,请考虑以下事项:
inline fun <R> Boolean?.tfn(tru:()->R, fls:()->R, nul:()->R) =
if (this == null) nul() else if (this) tru() else fls()
假设我还有其他内联函数,这些函数也采用 lambda参数,这些参数可能是(A)->R
或(A,B)->R
或(A,B,C)->R
的类型,我想将其参数传递给此函数。 它们都将提供一个R
但必须调用它们才能获得R
,而不知道此函数中参数的数量/类型/值。 有没有办法将上面的函数通用地修改为:
- 捕获任何 Lambda 参数为其输入返回
R
的通用情况 - 避免对将调用此函数的其他内联函数进行任何更改
- 保持在线效率
是不可能的
Kotlin 使用静态的强类型,编译器需要在编译时知道 lambda 参数的确切类型。 内部 lambda 实际上是kotlin.jvm.functions
接口之一(用于 JVM 或 Android)的实现,如下所示:
/* A function that takes 1 argument. */
public interface Function1<in P1, out R>
这些接口定义参数的确切数量及其类型。因此,不可能在 Kotlin 中创建vararg
lambda。 这当然与JVM中的vararg
只是内部使用普通数组的语法糖有关,但本身并不是类型系统构造,所以不能把vararg
当成类型。
依赖类型
解决问题的一个建议是使用Array
或Collection
作为函数参数,或传入任意Function<R>
,但此解决方案受到限制,无法静态强制执行每个传递函数的相同数量的参数,因为类型系统本身不知道集合/数组的大小或Function<R>
的参数计数。
要完全解决您的问题,您需要一种具有依赖类型的语言 系统。