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