类型推断失败:没有足够的信息来推断参数 T

Type inference failed: Not enough information to infer parameter T

我有一个函数可以比较来自两个不同端点的响应。它看起来像这样:

suspend fun <I, T> multiplexOrShadow(
    request: I,
    v1ResponseStringGenerator: KFunction1<T, String> = ::getV1ResponseString,
    v2ResponseStringGenerator: KFunction1<T, String> = ::getV2ResponseString,
) {
 <Call two different endpoints for request>
 val v1str = v1ResponseStringGenerator(v1Response)
 val v2str = v2ResponseStringGenerator(v2Response)

 <compare v1str and v2str>
}

如您所见,调用者可以传入关于如何从两个端点的响应生成响应字符串的函数。我还有一个响应生成器的默认函数。它们看起来像这样:

private fun <T> getV1ResponseString(v1Response: T): String {
    return v1Response.toString()
}

private fun <T> getV2ResponseString(v2Response: T): String {
    return v2Response.toString()
}

这在 IntelliJ 中编译得很好。但是,当我 运行 构建 gradle 时,它失败并显示错误

Type inference failed: Not enough information to infer parameter T in fun <T> getV1ResponseString(v1Response: T): String
Please specify it explicitly.

我做错了什么?我在 gradle 构建中使用 Kotlin 1.6.10。

看起来这是一个已知问题,自 Kotlin 1.6.20 以来已修复:https://youtrack.jetbrains.com/issue/KT-12963

对于 Kotlin 1.6.10,解决方法是避免使用不需要的 KFunctionN 类型。例如,如果您只需要调用一个函数,那么只使用 FunctionN 类型就可以了,也可以表示为 (...) -> ...:

suspend fun <I, T> multiplexOrShadow(
    request: I,
    v1ResponseStringGenerator: (T) -> String = ::getV1ResponseString,
    v2ResponseStringGenerator: (T) -> String = ::getV2ResponseString,
) {
   ...
}