无法在 Kotlin 中编译具有具体化类型参数的扩展函数
Unable to compile an extension function with reified type parameter in Kotlin
我有一个 kotlin 库项目并使用 Spek
进行测试。在我的测试中,我尝试使用以下函数:
inline fun JsonElement?.cast<reified T>(gson: Gson): T {
return if (this != null)
gson.fromJson<T>(this, javaClass<T>())
else null
}
当我尝试编译上面的代码时,出现编译错误:
Error: Gradle: java.lang.IllegalStateException: Error type encountered:
org.jetbrains.kotlin.types.ErrorUtils$UninferredParameterTypeConstructor@144bac7f (ErrorTypeImpl).
One of the possible reasons may be that this type is not directly accessible from this module.
To workaround this error, try adding an explicit dependency on the module
or library which contains this type to the classpath
但是这段代码编译正确:
inline fun JsonElement?.cast<reified T>(gson: Gson): T? {
return if (this != null)
gson.fromJson<T>(this, javaClass<T>())
else null
}
您注意到,return 类型已从 T
更改为 T?
。即使编译成功,我也会收到一条提示消息:
'T' has nullable upper bound. This means that a value of type may be null.
Using 'T?' is likely to mislead the reader.
这是正确的行为吗?
您遇到的异常是编译器中的错误。
你得到的警告是正确的,要消除它,写 <reified T: Any>
,这样一个普通的 T
就不再可以为空了。
我有一个 kotlin 库项目并使用 Spek
进行测试。在我的测试中,我尝试使用以下函数:
inline fun JsonElement?.cast<reified T>(gson: Gson): T {
return if (this != null)
gson.fromJson<T>(this, javaClass<T>())
else null
}
当我尝试编译上面的代码时,出现编译错误:
Error: Gradle: java.lang.IllegalStateException: Error type encountered:
org.jetbrains.kotlin.types.ErrorUtils$UninferredParameterTypeConstructor@144bac7f (ErrorTypeImpl).
One of the possible reasons may be that this type is not directly accessible from this module.
To workaround this error, try adding an explicit dependency on the module
or library which contains this type to the classpath
但是这段代码编译正确:
inline fun JsonElement?.cast<reified T>(gson: Gson): T? {
return if (this != null)
gson.fromJson<T>(this, javaClass<T>())
else null
}
您注意到,return 类型已从 T
更改为 T?
。即使编译成功,我也会收到一条提示消息:
'T' has nullable upper bound. This means that a value of type may be null.
Using 'T?' is likely to mislead the reader.
这是正确的行为吗?
您遇到的异常是编译器中的错误。
你得到的警告是正确的,要消除它,写 <reified T: Any>
,这样一个普通的 T
就不再可以为空了。