在 Kotlin 中具有可变数量的参数的 lambda 类型?



是否可以接收具有保证返回类型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,而不知道此函数中参数的数量/类型/值。 有没有办法将上面的函数通用地修改为:

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

是不可能的

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

/* A function that takes 1 argument. */
public interface Function1<in P1, out R>

这些接口定义参数的确切数量及其类型。因此,不可能在 Kotlin 中创建vararglambda。 这当然与JVM中的vararg只是内部使用普通数组的语法糖有关,但本身并不是类型系统构造,所以不能把vararg当成类型。

依赖类型

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

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

最新更新