Kotlin无法创建泛型项:如何将指定代码改造为泛型实现?
解决Kotlin泛型中
T::class.java无法使用的问题 我之前也碰到过一模一样的坑!本质原因是Kotlin的泛型类型擦除机制:在普通泛型函数里,T的实际类型信息会在编译后被擦除,编译器拿不到T对应的Class对象,所以才会抛出那个报错。
下面给你两种实用的解决方案:
方案1:使用Reified泛型(推荐)
这是最简洁的处理方式,需要把你的函数改成inline函数,同时用reified修饰泛型参数。这样编译器会在函数调用的位置,把实际类型直接替换进去,保留住完整的类型信息,自然就能正常获取T::class.java了。
示例代码:
inline fun <reified T> getAddedItem(documentChange: DocumentChange): T { return documentChange.document.toObject<T>(T::class.java) }
调用时直接指定实际类型即可,不用额外传Class参数:
val item: Item = getAddedItem(documentChange)
方案2:手动传入Class参数
如果你的函数不适合做成inline(比如是类的非inline成员函数),可以直接把Class<T>作为参数传入,绕开类型擦除的限制:
示例代码:
fun <T> getAddedItem(documentChange: DocumentChange, itemClass: Class<T>): T { // Firestore的toObject本身有直接传Class的重载,这里可以简化成toObject(itemClass) return documentChange.document.toObject(itemClass) }
调用时需要传入具体的Class对象:
val item: Item = getAddedItem(documentChange, Item::class.java)
补充小技巧
Firestore的DocumentSnapshot.toObject()方法本身就有两个重载:一个需要泛型+Class,另一个直接接收Class参数。用第二种方案时,直接传Class参数就足够了,不用额外写<T>,编译器会自动推断类型。
内容的提问来源于stack exchange,提问作者Lis Dya
相关产品推荐
相关产品推荐

