类型推断失败:没有足够的信息来推断参数 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,
) {
...
}
我有一个函数可以比较来自两个不同端点的响应。它看起来像这样:
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,
) {
...
}