Generics Kotlin泛型不能将T用作具体化的类型参数
我遇到了一些关于泛型、递归和内联具体化的问题 首先,我想递归调用一个使用泛型的方法。此方法从请求堆栈发出请求调用。假设需要提出5个请求,其中4个请求在引擎盖下完成,只有最后一个请求是重要的。其他的是精神检查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
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
,也不需要在生成大量垃圾字节码时内联它
您可以做的是让内联方法重载,它将类从具体化的参数中拉出来,并调用可以递归调用而不会出现问题的普通方法:
// 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)
//…等等
}