简体   繁体   English

kotlin 泛型 function 作为参数

[英]kotlin Generic type function as parameters

i stuck in some problems about the generic type in kotlin.我在 kotlin 中遇到了一些关于generic类型的问题。 Originally,i want to call the function with the value and the recall-function.最初,我想用值和召回功能调用 function。 So i write that below, but the value only allows me pass a type like string/Int somethings like that.所以我在下面写了这个,但是这个值只允许我传递一个像 string/Int 这样的类型。 I want to pass a function as parameter in the recall function.我想在召回 function 中传递一个 function 作为参数。

ClassA A类

ClassA<T>{
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) -> Unit)? = null

constructor(context: Context?, canCancel: Boolean, value: T, recallFunctionWithValue: (value: T) -> Unit) {
this.context = context
this.canCancel = canCancel
this.value = value
this.recallFunctionWithValue = recallFunctionWithValue
}
}

ClassB B类

ClassA(ctx, true,viewModel!!::testRefInside,viewModel!!::testRefOutside).createNativeNetworkDialog()

ViewModel视图模型

fun testRefOutside(test: Observable<Any>? ){

}
fun testRefInside():Observable<Any>?{
    return null
}

i try to do something like that我试着做这样的事情

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) -> Unit)? = null

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

but it shows the syntax error.但它显示语法错误。 Can someone help?有人可以帮忙吗?

Syntax Error语法错误

Error错误

Error2错误2

Error show in this place only RYEasyDialog means ClassA错误显示在这个地方只有 RYEasyDialog 表示 ClassA


It works!!有用!! now现在

  var recallFunctionWithFunction:((value: T) -> Unit)? = null
    constructor(context: Context?, canCancel: Boolean, value: () -> T, recallFunctionWithValue: (value: T) -> Unit) {
    this.context = context
    this.canCancel = canCancel
    this.functionPara = value
    this.recallFunctionWithFunction = recallFunctionWithValue

} }

8/6 Updated Vararg problems 8/6 更新Vararg 问题

I am doing something in advanced.我正在做一些高级的事情。 I just post it in completed code.我只是将其发布在完整的代码中。 If i don't use vararg, the如果我不使用可变参数,则

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

without casting as ((Observable<Any>)->LiveData<Boolean>) .but the callMuipleApi receives vararg parameter, i have to cast it into as ((Observable)->LiveData) but i it doesn't show any error but the function callmutipleapi and callgetteammateslist in not called.没有转换as ((Observable<Any>)->LiveData<Boolean>) 。但是 callMuipleApi 接收可变参数参数,我必须将其转换为 ((Observable)->LiveData) 但我没有显示任何错误但是function callmutilpleapi 和 callgetteammateslist 在没有被调用。 can anyone help?谁能帮忙?

ViewModel视图模型

fun callMultipleAPI( vararg  observable: Observable<Any>):LiveData<Boolean>{
    if(progressDialogData==null){
        progressDialogData= MutableLiveData()
    }
    progressDialogData?.setValue(true)
    repo.callMultipleAPI<Any>(*observable, observer = RYEasyObserver(object : RyObserverSingleStatusListener<List<Any>> {
        override fun onNext(g: List<Any>) {
            Log.d("test",g.toString())
            for(model in g){
                when(model){
                    is GetTeammateListModel ->{setCallGetTeammateListResponse(model)}
                    is GetTeamListModel ->{setCallGetTeamListResponse(model)}
                    is GetMessageSumModel->{setCallGetMessageSumResponse(model)}
                    is GetCallModel->{setCallGetResponse(model)}
                }
            }
            progressDialogData?.setValue(false)
        }


        override fun onError() {
            progressDialogData?.setValue(false)
        }

    },true))
    return progressDialogData!!
}

Fragment分段

EasyDialog<Observable<Any>,LiveData<Boolean>>(ctx, true,viewModel!!::callGetTeammateListAPITEST,recallFunctionWithFunction = viewModel!!::callMultipleAPI as ((Observable<Any>)->LiveData<Boolean>)).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() {
    val builder = AlertDialog.Builder(context)
    if (!canCancel) {
        builder.setCancelable(false)
    } else {
        builder.setNegativeButton(context?.resources?.getString(R.string.gloda_cancel)) { dialogInterface, id -> }
    }
    builder.setMessage(context?.resources?.getString(R.string.global_network_error))
    builder.setPositiveButton(context?.resources?.getString(R.string.global_retry)) { dialog, id ->
        recallFunction?.invoke()
        value?.let { it1 -> recallFunctionWithValue?.invoke(it1) }
        //functionPara?.let { it2->recallFunctionWithFunction?.invoke(it2) }
        functionPara?.let{ functionPara->{ recallFunctionWithFunction?.let {
                recallFunctionWithFunction-> compose<T,V>(recallFunctionWithFunction  ,functionPara).invoke()
        }}}
    }

    val dialog = builder.create()
    dialog.show()
}
    fun <T, V> compose( f: (T) -> V,    g:() -> T ): () -> V {
            return {  f(g()) }
}

The last constructor parameter is最后一个构造函数参数是

(() -> T) -> Unit

Based on what you pass for the third constructor paramter, T is inferred to be Observable<Any>?根据您为第三个构造函数参数传递的内容, T被推断为Observable<Any>? . . so it is expecting a所以它期待一个

(() -> Observable<Any>?) -> Unit

but testRefOutside istestRefOutside

 Observable<Any>? -> Unit

I'm guessing you probably didn't mean to define a third-order function by making the input of your function another function.我猜你可能不是想通过将 function 的输入设为另一个 function 来定义三阶 function。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM