Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Kotlin中参数数可变的Lambda类型?_Generics_Lambda_Kotlin_Inline - Fatal编程技术网

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

Generics Kotlin中参数数可变的Lambda类型?,generics,lambda,kotlin,inline,Generics,Lambda,Kotlin,Inline,是否可以作为内联lambda参数接收具有保证返回类型R但参数数量可变的函数类型?为简单起见,考虑以下内容: inline fun <R> Boolean?.tfn(tru:()->R, fls:()->R, nul:()->R) = if (this == null) nul() else if (this) tru() else fls() inline fun Boolean?.tfn(tru:()->R,fls:()->R,nul:()->R)= if(

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

inline fun <R> Boolean?.tfn(tru:()->R, fls:()->R, nul:()->R) =
  if (this == null) nul() else if (this) tru() else fls()
inline fun 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>
    
    /*接受1个参数的函数*/
    公共接口功能1
    
    这些接口定义了参数的确切数量及其类型。因此,无法在Kotlin中创建
    vararg
    lambda。 这当然与以下事实有关:JVM中的
    vararg
    只是内部使用普通数组的语法糖,但它本身不是一个类型系统构造,因此不能像对待
    vararg
    s类型那样对待它

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

    要完全解决你的问题,你需要一门语言
    系统。

    如果您想要可变数量的参数,为什么不采用
    列表
    ?除此之外,我不这么认为,您可以使用
    函数
    ,但它不会被内联