如何在泛型函数中获取返回值?及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
相关产品推荐
相关产品推荐

