Generics Kotlin中参数数可变的Lambda类型?
是否可以作为内联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(
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
,而不知道此函数中参数的数量/类型/值。是否有办法将上述函数一般修改为:
R
的一般情况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类型那样对待它
依赖类型
解决问题的一个建议是使用数组
或集合
作为函数参数,或传入任意函数
,但此解决方案的局限性在于无法静态强制执行每个传递函数的相同数量的参数,因为类型系统本身不知道集合/数组的大小或函数的参数计数
要完全解决你的问题,你需要一门语言
系统。如果您想要可变数量的参数,为什么不采用列表
?除此之外,我不这么认为,您可以使用函数
,但它不会被内联