You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在泛型函数中获取返回值?及Java mapTo方法传参问题

嗨,我来帮你搞定这两个问题~

一、泛型函数中获取返回值的正确姿势

在Kotlin(以及Java)中,由于泛型的类型擦除机制,运行时JVM无法直接获取泛型参数T的具体类型信息。要在泛型函数中拿到返回值对应的类型,通常有两种常用方式:

  • 显式传入Class<T>作为函数参数,直接提供类型信息
  • 利用Kotlin特有的reified泛型(配合内联函数),在编译时保留类型信息
二、修复你的mapTo调用问题

你给出的示例代码里return row.mapTo(T)是无法运行的,因为T只是编译时的类型参数,运行时会被擦除,不能直接当作Class对象传递给mapTo方法。下面给你两种可行的修复方案:

方案1:显式传入Class参数

修改函数签名,把Class<T>作为参数传入,这样就能直接传给mapTo:

fun <T> query(sql: String, params: JsonArray, clazz: Class<T>): T? { 
    val row = otherfun(sql, params) 
    return row.mapTo(clazz) 
}

调用的时候,直接传递具体类的Class对象即可,比如:

// 假设你要映射到User类
val user = query("SELECT * FROM users WHERE id = ?", params, User::class.java)

方案2:使用reified泛型(更简洁)

如果这个函数可以定义为内联函数,就可以用Kotlin的reified关键字保留泛型类型信息,这样不用额外传参数就能拿到T的Class对象:

inline fun <reified T> query(sql: String, params: JsonArray): T? { 
    val row = otherfun(sql, params) 
    return row.mapTo(T::class.java) 
}

调用的时候就简单多了,编译器会自动推断或者你显式指定泛型即可:

// 让编译器自动推断类型
val user: User? = query("SELECT * FROM users WHERE id = ?", params)
// 或者显式指定泛型
val user = query<User>("SELECT * FROM users WHERE id = ?", params)

简单总结下:核心问题是泛型类型擦除导致运行时丢失T的类型信息,两种方案都是通过不同方式把类型信息传递到运行时,让mapTo方法能正确创建目标对象。

内容的提问来源于stack exchange,提问作者Roman N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:44:55