当前位置: 首页 > 知识库问答 >
问题:

无法在Kotlin中编译具有具体化类型参数的扩展函数

孔棋
2023-03-14

我有一个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
}
'T' has nullable upper bound. This means that a value of type may be null.
Using 'T?' is likely to mislead the reader.

是正确的行为吗?

共有1个答案

蒯嘉赐
2023-03-14

您得到的异常是编译器中的bug。

您得到的警告是正确的,要消除它,请编写 ,这样,普通的t不再是空的。

 类似资料:
  • 我正在尝试使用具体化类型的函数作为扩展函数,但我认为这是不可能的,因为在我检查生成的字节码后,我发现方法签名是私有的,有什么办法可以将其公开? CommonExtensions.kt 静态编程语言字节码: 客户代码: 静态编程语言文件 Java档案

  • 我遇到了一个奇怪的行为,在类型为“具体化”的函数中使用Gson进行反序列化。仅当类型参数中涉及接口时才会发生这种情况。 采用以下代码: 第4行使用自定义扩展函数Gson。fromJson(json:String):T。 如果定义为具体化,则失败: 如果它被定义为普通类型参数,它就可以工作: (注意,使具体化在这里没有意义,只是想了解它在特殊用例中的影响) 使用具体化时的异常如下所示:

  • 我在学习Kotlin的过程中遇到了一个我想不通的问题。我想在Kotlin中扩展Java类,并且能够在不同的情况下使用它的三个构造函数中的任何一个(基于我想抛出异常时所拥有的信息)。在java中,我的类将如下所示: 有人能建议我在Kotlin如何正确地做到这一点吗?

  • 我不熟悉泛型。我有一个抽象类(1)和一个抽象方法。我有另一个抽象类(2)和一些抽象方法,我希望在一些DTO(3,4)中共享这些抽象方法。我想要一个(1)的具体扩展来处理任何扩展(2)的东西。 1. 扩展StagingError的两个类:3.

  • 从Kotlin调用Java代码时,存在SAM转换,因此Java代码如下所示: 可以如下所示: 现在,我正在处理一个Kotlin项目,我想将功能接口定义为事件侦听器: 在SomeClass中,我有一个设置监听器的函数: 当我创建这个类的实例并尝试调用setter函数时,我是这样做的: 我知道静态编程语言有函数类型,因此不支持来自各种站点的SAM转换,例如这个站点。 我读过一些关于函数类型的书,但我以

  • 问题内容: 嘿 语言是Java。我想扩展构造函数具有参数的此类。 这是主要的课程 这是儿童班 如何编写正确的语法?并且错误是“构造函数无法应用于给定类型” 问题答案: 您可以定义构造函数所需的任何参数,但是有必要将超类的一个构造函数作为自己的构造函数的第一行来调用。可以使用或来完成。