Kotlin 中参数数量可变的 Lambda 类型?

sir*_*sel 5 generics lambda inline kotlin

是否可以接收具有保证返回类型R但参数数量可变的函数类型作为内联 lambda 参数?为简单起见,请考虑以下事项:

inline fun <R> Boolean?.tfn(tru:()->R, fls:()->R, nul:()->R) =
  if (this == null) nul() else if (this) tru() else fls()
Run Code Online (Sandbox Code Playgroud)

假设我还有其他内联函数,它们也采用可能为or或类型的lambda 参数,我希望将其参数传递给该函数。它们都将提供 an但必须调用它们才能获取,而不知道该函数中参数的数量/类型/值。有没有办法将上面的函数一般修改为:(A)->R(A,B)->R(A,B,C)->RRR

  1. R捕获返回其输入的任何 lambda 参数的一般情况
  2. 避免对将调用此函数的其他内联函数进行任何更改
  3. 保持在线效率

mac*_*usz 5

这是不可能的

Kotlin 使用静态、强类型,编译器需要在编译时知道 lambda 参数的确切类型。内部 lambda 实际上是接口之一kotlin.jvm.functions(对于 JVM 或 Android)的实现,如下所示:

/* A function that takes 1 argument. */
public interface Function1<in P1, out R>
Run Code Online (Sandbox Code Playgroud)

这些接口定义了参数的确切数量及其类型。因此,不可能vararg在 Kotlin 中创建 lambda。这当然与以下事实有关:vararg在 JVM 中,它只是一个内部使用普通数组的语法糖,但它本身并不是一个类型系统构造,因此您不能将varargs 视为类型。

依赖类型

解决您的问题的一个建议是使用 anArray或 aCollection作为函数参数,或传入任意Function<R>,但此解决方案的局限性在于无法静态强制每个传递函数的参数数量相同,因为类型系统本身不知道集合/数组的大小或 的参数计数Function<R>

要完全解决您的问题,您需要一种具有依赖类型系统的语言 。