Kotlin 泛型不能使用 T 作为具体化的类型参数
Kotlin Generics Cannot use T as a reified type parameter
我 运行 关注一些关于泛型、递归和内联具体化的问题。
首先,我想递归调用一个使用泛型的方法。此方法从请求堆栈中进行请求调用。假设需要提出 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.
}
现在完整性检查请求已发出并成功,最后一个请求我想将响应(或错误)冒泡到表示层。我面临的问题是处理响应的方法是内联具体化的。我无法在不收到错误的情况下调用此方法,"cannot use T as a reified type parameter"。
private inline fun <reified T : EmptyStateInfo> handleResponse(
response: Response,
callback: Callback<T>?
) = when (response) {
is Response.StringResponseItem -> {
try {
val responseData = gson.fromJson(response.data, T::class.java)
...
// do something with response data
} catch (e: JsonSyntaxException) {
handleNonHttpFailure(e, callback)
}
}
}
如何解决这个问题?这是我尝试过的。
- 从 handleResponse() 中删除内联具体化:由于使用 T::class.java,我无法使 handleResponse() 不被内联具体化。如果我这样做,我将无法以那种方式使用 T。
- 具体化 multipleRequests() :这样做可以让我很好地调用 handleResponse(),但是,我无法递归调用 multipleRequests()。我收到错误
inline function 'private final inline fun
multipleRequests()' cannot be recursive
有人对如何解决这个问题有任何想法吗?
你真的不需要在你的 handleResponse
方法中具体化 T
,你也不想在生成大量垃圾字节码时内联它。
你可以做的是内联方法重载,它从具体化参数中提取 class 并调用可以毫无问题地递归调用的普通方法:
// 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
}
我 运行 关注一些关于泛型、递归和内联具体化的问题。
首先,我想递归调用一个使用泛型的方法。此方法从请求堆栈中进行请求调用。假设需要提出 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.
}
现在完整性检查请求已发出并成功,最后一个请求我想将响应(或错误)冒泡到表示层。我面临的问题是处理响应的方法是内联具体化的。我无法在不收到错误的情况下调用此方法,"cannot use T as a reified type parameter"。
private inline fun <reified T : EmptyStateInfo> handleResponse(
response: Response,
callback: Callback<T>?
) = when (response) {
is Response.StringResponseItem -> {
try {
val responseData = gson.fromJson(response.data, T::class.java)
...
// do something with response data
} catch (e: JsonSyntaxException) {
handleNonHttpFailure(e, callback)
}
}
}
如何解决这个问题?这是我尝试过的。
- 从 handleResponse() 中删除内联具体化:由于使用 T::class.java,我无法使 handleResponse() 不被内联具体化。如果我这样做,我将无法以那种方式使用 T。
- 具体化 multipleRequests() :这样做可以让我很好地调用 handleResponse(),但是,我无法递归调用 multipleRequests()。我收到错误
inline function 'private final inline fun multipleRequests()' cannot be recursive
有人对如何解决这个问题有任何想法吗?
你真的不需要在你的 handleResponse
方法中具体化 T
,你也不想在生成大量垃圾字节码时内联它。
你可以做的是内联方法重载,它从具体化参数中提取 class 并调用可以毫无问题地递归调用的普通方法:
// 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
}