Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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
Generics Kotlin泛型不能将T用作具体化的类型参数_Generics_Kotlin_Kotlin Reified Type Parameters - Fatal编程技术网

Generics Kotlin泛型不能将T用作具体化的类型参数

Generics Kotlin泛型不能将T用作具体化的类型参数,generics,kotlin,kotlin-reified-type-parameters,Generics,Kotlin,Kotlin Reified Type Parameters,我遇到了一些关于泛型、递归和内联具体化的问题 首先,我想递归调用一个使用泛型的方法。此方法从请求堆栈发出请求调用。假设需要提出5个请求,其中4个请求在引擎盖下完成,只有最后一个请求是重要的。其他的是精神检查 private fun <T : EmptyStateInfo> multipleRequests( callback: Callback<T>? ) { ... // request is made here. On the suc

我遇到了一些关于泛型、递归和内联具体化的问题

首先,我想递归调用一个使用泛型的方法。此方法从请求堆栈发出请求调用。假设需要提出5个请求,其中4个请求在引擎盖下完成,只有最后一个请求是重要的。其他的是精神检查

private fun <T : EmptyStateInfo> multipleRequests(
        callback: Callback<T>?
) {

    ...
    // request is made here. On the success of that request, this method is called again to make another request. I use a linkedList of requests to keep track.
}
私人娱乐多重任务(
回叫:回叫?
) {
...
//请求在此处发出。在该请求成功后,将再次调用此方法以发出另一个请求。我使用请求的linkedList来跟踪。
}
现在,健全性检查请求已经发出并成功了,最后一个请求我想向表示层冒泡响应(或错误)。我面临的问题是,处理响应的方法是内联具体化的。我无法在没有收到错误的情况下调用此方法,“不能将T用作具体化的类型参数”

private inline fun handleResponse(
答复:答复,,
回叫:回叫?
)=何时(响应){
is Response.StringResponseItem->{
试一试{
val responseData=gson.fromJson(response.data,T::class.java)
...
//处理响应数据
}捕获(e:JsonSyntaxException){
handleNonHttpFailure(e,回调)
}
}
}
如何解决这个问题?这是我试过的

  • 从HandlerResponse()删除内联具体化:由于使用了T::class.java,我无法使HandlerResponse()不进行内联具体化。如果我那样做的话,我将无法以那种方式使用t
  • 使multipleRequests()具体化:这样做可以很好地调用handleResponse(),但是,我无法递归调用multipleRequests()。我得到一个错误,上面说
  • 内联函数的私有最终内联函数 multipleRequests()不能是递归的


    任何人对如何解决这个问题有任何想法吗?

    HandlerResponse
    方法中,您实际上不需要具体化
    t
    ,也不需要在生成大量垃圾字节码时内联它

    您可以做的是让内联方法重载,它将类从具体化的参数中拉出来,并调用可以递归调用而不会出现问题的普通方法:

    // reified entry point
    private inline fun <reified T : EmptyStateInfo> multipleRequests(callback: Callback<T>?) = multipleRequests(callback, T::class.java)
    
    // recursive method
    private fun <T : EmptyStateInfo> multipleRequests(callback: Callback<T>?, tClass : Class<T>) {
        // ... calls requests passing tClass as argument
    }
    
    private fun <T : EmptyStateInfo> handleResponse(
        response: Response,
        callback: Callback<T>?,
        tClass : Class<T>){
        // ... something something
        val responseData = gson.fromJson(response.data, tClass)
        // ... etc
    }
    
    //具体化的入口点
    私有内联fun multipleRequests(callback:callback?)=multipleRequests(callback,T::class.java)
    //递归方法
    私人趣味多任务(回调:回调?,tClass:Class){
    //…调用作为参数传递tClass的请求
    }
    私人娱乐手册(
    答复:答复,,
    回拨:回拨?,
    tClass:Class){
    //…什么
    val responseData=gson.fromJson(response.data,tClass)
    //…等等
    }
    
    handleResponse
    方法中,您实际上不需要具体化
    t
    ,也不需要内联它,因为您正在生成大量垃圾字节码

    您可以做的是让内联方法重载,它将类从具体化的参数中拉出来,并调用可以递归调用而不会出现问题的普通方法:

    // reified entry point
    private inline fun <reified T : EmptyStateInfo> multipleRequests(callback: Callback<T>?) = multipleRequests(callback, T::class.java)
    
    // recursive method
    private fun <T : EmptyStateInfo> multipleRequests(callback: Callback<T>?, tClass : Class<T>) {
        // ... calls requests passing tClass as argument
    }
    
    private fun <T : EmptyStateInfo> handleResponse(
        response: Response,
        callback: Callback<T>?,
        tClass : Class<T>){
        // ... something something
        val responseData = gson.fromJson(response.data, tClass)
        // ... etc
    }
    
    //具体化的入口点
    私有内联fun multipleRequests(callback:callback?)=multipleRequests(callback,T::class.java)
    //递归方法
    私人趣味多任务(回调:回调?,tClass:Class){
    //…调用作为参数传递tClass的请求
    }
    私人娱乐手册(
    答复:答复,,
    回拨:回拨?,
    tClass:Class){
    //…什么
    val responseData=gson.fromJson(response.data,tClass)
    //…等等
    }