首页 文章

在Kotlin中具有可变数量的args的Lambda类型?

提问于
浏览
2

是否可以作为内联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 回答

  • 2

    这是不可能的

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

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

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

    依赖类型

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

    要完全解决您的问题,您需要一种具有dependent type系统的语言 .

相关问题