【问题标题】:kotlin geneirc with vararg parameter带有可变参数的 kotlingeneirc
【发布时间】:2020-06-08 10:39:27
【问题描述】:

现在我正在处理一些关于将函数作为参数传递给带有 vararg 参数和泛型参数的函数的问题。下面的代码适用于一个函数作为其他函数的参数

类似的函数 funA(funB(parameter):return1):return2

但是当我做这样的功能时

funA(vararg funB(参数):return1):return2

它不起作用。我尝试过类似 Array 或 KFunction1

视图模型

fun callMultipleAPI( vararg  observable: Observable<Any>):LiveData<Boolean>{
.....
return progressDialogData!!
}

fun callGetTeammateListAPITEST():Observable<Any>{
....
return repo.callGetMessageSumTEST()!!
}

片段

fun test(){
EasyDialog<Observable<Any>,LiveData<Boolean>>(ctx, true,viewModel!!::callGetTeammateListAPITEST,recallFunctionWithFunction = viewModel!!::callMultipleAPI).createNativeNetworkDialog2()
}

EasyDialog

class EasyDialog<T,V> {
var canCancel: Boolean = true
var recallFunction: (() -> T)? = null
var recallFunctionWithValue: ((value: T) -> Unit)? = null
var context: Context? = null
var value: T? = null
var functionPara :(()->T)? = null
var recallFunctionWithFunction:((T) -> V)? = null



constructor(
context: Context?, canCancel: Boolean, value: ()->T, recallFunctionWithFunction:  (T) -> V  ){
this.context = context
this.canCancel = canCancel
this.functionPara = value
this.recallFunctionWithFunction = recallFunctionWithFunction
}

fun createNativeNetworkDialog2() {
...

    functionPara?.let{ functionPara->{ recallFunctionWithFunction?.let {
            recallFunctionWithFunction-> compose<T,V>(recallFunctionWithFunction  ,functionPara).invoke()
    }}}
}

}

    fun <T, V> compose( f: (T) -> V,    g:() -> T ): () -> V {
            return {  f(g()) }
}

但它只允许没有可变参数的函数。 我试着做出如下的东西

var functionPara :(()->T)? = null
var recallFunctionWithFunction:( (Array<out T>) -> V)? = null
    constructor(
    context: Context?, canCancel: Boolean, value: ()->T, recallFunctionWithFunction:   (Array<out T>) -> V  ){
    this.context = context
    this.canCancel = canCancel
    this.functionPara = value
    this.recallFunctionWithFunction = recallFunctionWithFunction
}
    fun <T, V> compose( f: (Array<out T>)->V,   vararg g:() -> T ): () -> V {

        return {  f(g()) }
}

但它显示类型不匹配

type Mismatch

谁能帮忙?

【问题讨论】:

标签: kotlin generics reflection variadic-functions


【解决方案1】:

这是因为g 是一个函数数组。不是函数。看起来你已经调用了所有这些函数并收集了结果:

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()) }
}

如果你想在这里使用数组,你必须将你的函数标记为inline

【讨论】:

  • 在我使用你的函数后,它会显示类似link 的错误在那之后,我在 compose 函数中将 list 更改为 Array 它就像 link我该怎么办?
  • 你真的需要Array而不是List吗?
  • 这是因为带有可变参数的函数recallFunctionWithFunction会自动转换为Array ->V
  • 如果我在 EasyObserver 中将所有 Arraylink 的不匹配错误
  • 是的,我很有趣:为什么有人在 Kotlin 中使用 Array 而不是 List
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 2012-02-22
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多