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

如何在Kotlin中获得泛型param类?

高森
2023-03-14

我需要能够在运行时告诉kotlin集合的泛型类型。我怎么做?

val list1 = listOf("my", "list")
val list2 = listOf(1, 2, 3)
val list3 = listOf<Double>()

/* ... */

when(list.genericType()) {
    is String -> handleString(list)
    is Int -> handleInt(list)
    is Double -> handleDouble(list)
}

共有1个答案

宰父劲
2023-03-14

您可以使用内联函数和reificed类型参数来实现这一点:

inline fun <reified T : Any> classOfList(list: List<T>) = T::class

(可运行演示,包括如何检查When语句中的类型)

解决方案仅限于在编译时已知t的实际类型参数的情况,因为内联函数在编译时转换,编译器在每个调用站点用实际类型替换它们的reificed类型参数。

 类似资料:
  • 只能在类文本的左侧使用类 是否可以像在C#中那样对泛型参数提供类约束,或者是否可以使用其他语法来获取泛型参数的类型信息?

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

  • 问题内容: 我有一个泛型类。在一种方法中,我想获取的类实例,但我无法调用。 使用它解决问题的首选方法是什么? 问题答案: 简短的答案是,无法找到Java中泛型类型参数的运行时类型。我建议阅读Java教程中有关类型擦除的章节以获取更多详细信息。 一个流行的解决方案是Class将type参数的传递给泛型类型的构造函数,例如

  • 问题内容: 我有一个泛型类。在一种方法中,我想获取类型T的类实例,但是我不能调用。 使用它解决问题的首选方法是什么? 问题答案: 简短的答案是,无法找到Java中泛型类型参数的运行时类型。我建议阅读Java教程中有关类型擦除的章节以获取更多详细信息。 一个流行的解决方案是将type参数的传递给泛型类型的构造函数,例如

  • 在类内部,我如何找到泛型类中传递的是什么类类型。例如,在上面,我想找到Integer被传递。

  • 主要内容:泛型约束,型变,星号投射泛型,即 "参数化类型",将类型参数化,可以用在类,接口,方法上。 与 Java 一样,Kotlin 也提供泛型,为类型安全提供保证,消除类型强转的烦恼。 声明一个泛型类: 创建类的实例时我们需要指定类型参数: 以下实例向泛型类 Box 传入整型数据和字符串: 输出结果为: 定义泛型类型变量,可以完整地写明类型参数,如果编译器可以自动推定类型参数,也可以省略类型参数。 Kotlin 泛型函数的声明