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

如何在Kotlin中获得泛型参数类

朱炜
2023-03-14
snapshot?.getValue(Person::class.java)
class DataQuery<T : IModel> 
snapshot?.getValue(T::class.java)

只能在类文本的左侧使用类

是否可以像在C#中那样对泛型参数提供类约束,或者是否可以使用其他语法来获取泛型参数的类型信息?

共有1个答案

盛城
2023-03-14

对于具有泛型参数T的类,不能这样做,因为没有T的类型信息,因为JVM会擦除类型信息。因此,这样的代码无法工作:

class Storage<T: Any> {
    val snapshot: Snapshot? = ...

    fun retrieveSomething(): T? {
        return snapshot?.getValue(T::class.java) // ERROR "only classes can be used..."
    }
}

但是,如果将T的类型具体化并在内联函数中使用,则可以使其工作:

class Storage {
    val snapshot: Snapshot? = ...

    inline fun <reified T: Any> retrieveSomething(): T? {
        return snapshot?.getValue(T::class.java)
    }
}

请注意,内联函数if public只能访问类的公共成员。但是可以有两个函数的变体,一个接收不是内联的类参数并访问私有内部,另一个内联帮助器函数从推断的类型参数进行具体化:

class Storage {
    private val snapshot: Snapshot? = ...

    fun <T: Any> retrieveSomething(ofClass: Class<T>): T? {
        return snapshot?.getValue(ofClass)
    }

    inline fun <reified T: Any> retrieveSomething(): T? {
        return retrieveSomething(T::class.java)
    }
}
class Storage <T: Any> {
    val snapshot: Snapshot? = ...

    inline fun <reified R: T> retrieveSomething(): R? {
        return snapshot?.getValue(R::class.java)
    }
}
 类似资料:
  • 我需要能够在运行时告诉kotlin集合的泛型类型。我怎么做?

  • 是否有一种方法可以通过反射获得具体化泛型的实际类型参数?

  • 我只想从使用Log4j(v2.8.2)的Java移植以下代码: 问题在于newBuilder()方法,该方法在log4j中定义为某种递归泛型: Java代码会自动推断泛型参数,而Kotlin的情况并非如此。在Kotlin中调用此方法有什么解决方案吗? 我在Kotlin尝试的代码: 它有以下错误: 错误:(90,48)静态编程语言:类型推断失败:没有足够的信息来推断参数B的乐趣! 当代码在粘贴时自动

  • 我需要 Kotlin 中的一个集合来仅包含实现给定接口的元素。 例如:包含动物集合的地图: 通过阅读文档、博客和SO问题,我编写了使用Generics in关键字的代码: 现在我想在Test类中添加一个读取“data”内容的方法,例如将其打印到控制台: 如果我这样做,我会遇到编译错误: 我的解决方案是强制我的动物进入一个ArrayList 但是我不确定这是编写这种代码的最好方式。有没有更好的方式告

  • 问题内容: 该问题的可接受答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数并从中调用方法。 然后创建的新实例,并传递参数。 如果新类的泛型类型参数不是某个已知类,但它本身是泛型类型参数,该怎么办?假设我还有其他班级,我想从该班级内部创建一个新实例。然后,如果尝试传递,则会收到以下编译器错误: 有没有办法解决? 对我来说触发错误的代码是: 发生错误,是因为我不会写。还有其他传递相同信息的方

  • 这个问题的公认答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数,并从中调用方法。 然后创建的新实例,并传入参数。 对我来说,触发错误的特定代码位是: 错误发生,因为我不能编写。还有其他方式传递同样的信息吗?