Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Android 带有vararg参数和convert数组的kotlin引用函数<;挂牌上市<;出来_Android_Kotlin_Generics_Reflection_Variadic Functions - Fatal编程技术网

Android 带有vararg参数和convert数组的kotlin引用函数<;挂牌上市<;出来

Android 带有vararg参数和convert数组的kotlin引用函数<;挂牌上市<;出来,android,kotlin,generics,reflection,variadic-functions,Android,Kotlin,Generics,Reflection,Variadic Functions,我是基于这个话题提出这个问题的 所以,我想提前问一下。 有人用数组和列表回答了这个问题 Class Test<T,V>{ var functionPara :(()->T)? = null var recallFunctionWithFunction:( (Array<out T>) -> V)? = null constructor(value: ()->T, recallFunctionWithFunction: (Arra

我是基于这个话题提出这个问题的

所以,我想提前问一下。 有人用数组和列表回答了这个问题

Class Test<T,V>{
   var functionPara :(()->T)? = null
   var recallFunctionWithFunction:( (Array<out T>) -> V)? = null

   constructor(value: ()->T, recallFunctionWithFunction:   (Array<out T>) -> V  ){
   this.functionPara = value
   this.recallFunctionWithFunction = recallFunctionWithFunction
}
inline fun <reified T, V> compose(crossinline f: (Array<out T>) -> V, vararg g: () -> T): () -> V {
val results = g.map { it() }
return { f(results.toTypedArray()) }
}

fun <T, V> compose(f: (List<out T>) -> V, vararg g: () -> T): () -> V {
val results = g.map { it() }
return { f(results) }
}
}
fun runCompose(){
compose(functionPara,recallFunctionWithFunction).invoke()
}
类测试{
var functionPara:(()->T)?=null
var recallFunctionWithFunction:((数组)->V)?=null
构造函数(值:()->T,recallFunctionWithFunction:(数组)->V){
this.functionPara=值
this.recallFunctionWithFunction=recallFunctionWithFunction
}
内联fun compose(交叉内联f:(数组)->V,vararg g:()->T:()->V{
val results=g.map{it()}
返回{f(results.toTypedArray())}
}
有趣的组合(f:(列表)->V,vararg g:()->T:()->V{
val results=g.map{it()}
返回{f(结果)}
}
}
有趣的写作{
编写(functionPara,recallFunctionWithFunction).invoke()
}
但是我发现当我引用一个带有vararg参数的函数时

fun functionA(vararg :Observable<Any>):LiveData<Boolean>{
}
fun functionB():Observable<Any>{
}
fun函数(vararg:observeable):LiveData{
}
fun functionB():可观察{
}
当我执行::function之类的操作时,A的类型将是
Array->LiveData
,因此,当我执行类似的操作时

Test(::functionB,::function).runCompose()

情景1 如果将compose函数与accepting List type一起使用,它将显示由于referencement::function返回数组而导致的类型不匹配

情景2 如果我将compose函数用于接受数组类型,它将显示错误

无法将“T”用作具体化的类型参数。改用类


在上一篇文章中,有人回答我将数组转换为列表。但是如何将带有vararg参数的引用函数转换为原始
Array由于类型擦除,无法将列表转换为类型化数组。我认为最简单的方法是在任何地方使用
List

class Test<T, V>(val recallFunctionWithFunction: (List<T>) -> V, val functionPara: () -> T) {

    inline fun compose(crossinline f: (List<T>) -> V, vararg g: () -> T): () -> V {
        return { f(g.map { it.invoke() }) }
    }

    fun runCompose() {
        compose(recallFunctionWithFunction, functionPara).invoke()
    }
}

fun functionA(l: List<Observable<Any>>): LiveData<Boolean> {
...
}
fun functionB(): Observable<Any> {
...
}
类测试(val-recallFunctionWithFunction:(List)->V,val-functionPara:()->T){
内联有趣的组合(交叉内联f:(列表)->V,vararg g:()->T:()->V{
返回{f(g.map{it.invoke()})}
}
有趣的写作{
编写(recallFunctionWithFunction,functionPara).invoke()
}
}
趣味功能(l:列表):LiveData{
...
}
fun functionB():可观察{
...
}
另一个解决方案

class Test<T, V>(
    val recallFunctionWithFunction: (Array<out T>) -> V,
    val functionPara: () -> T,
    val clazz: Class<T>
) {

    companion object {
        inline fun <reified T, V> create(
            noinline recallFunctionWithFunction: (Array<out T>) -> V,
            noinline functionPara: () -> T
        ) = Test(recallFunctionWithFunction, functionPara, T::class.java)
    }

    inline fun compose(crossinline f: (Array<out T>) -> V, vararg g: () -> T): () -> V {
        return {
            @Suppress("UNCHECKED_CAST")
            val arr = java.lang.reflect.Array.newInstance(clazz, g.size) as Array<T>
            g.forEachIndexed { index, fg -> arr[index] = fg.invoke() }
            f(arr)
        }
    }

    fun runCompose() {
        compose(recallFunctionWithFunction, functionPara).invoke()
    }
}

...
val t = Test.create(::functionA, ::functionB)
t.runCompose()
类测试(
val recallFunctionWithFunction:(数组)->V,
val functionPara:()->T,
瓦尔·克拉兹:课堂
) {
伴星{
内联乐趣创建(
noinline recallFunctionWithFunction:(数组)->V,
noinline函数para:()->T
)=测试(重新调用FunctionWithFunction、functionPara、T::class.java)
}
内联fun compose(交叉内联f:(数组)->V,vararg g:()->T:()->V{
返回{
@抑制(“未选中的_CAST”)
val arr=java.lang.reflect.Array.newInstance(clazz,g.size)作为数组
g、 ForAchineDexed{index,fg->arr[index]=fg.invoke()}
f(arr)
}
}
有趣的写作{
编写(recallFunctionWithFunction,functionPara).invoke()
}
}
...
val t=测试。创建(::function,::functionB)
t、 runCompose()

它不起作用。因为当我调用Test(::functionB,::function).runCompose()时::functionB是Array>-->LiveData而不是list,vararg的函数引用是Array@yuk,正如我所说的,在
function
中也使用list而不是varargs和Array。还添加了另一个解决方案它很有效!!!!非常感谢,但我想是否有更简单的方法。