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

如何解决这个问题?这是我尝试过的。

  1. 从 handleResponse() 中删除内联具体化:由于使用 T::class.java,我无法使 handleResponse() 不被内联具体化。如果我这样做,我将无法以那种方式使用 T。
  2. 具体化 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
}