使用Kotlin Poet时,如何获取List<String>的KClass<List<String>>类型?
解决Kotlin Poet中PropertySpec构建List类型的问题
直接用List<String>::class.asTypeName()会失败,原因是Kotlin的泛型类型通过::class获取时会丢失泛型参数信息——List<String>::class实际只能拿到List::class的原始类型,无法保留<String>的泛型约束。
正确的做法是通过Kotlin Poet提供的parameterizedBy方法构建带泛型的参数化类型:
方案一:基于已有类型扩展
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy import com.squareup.kotlinpoet.PropertySpec import com.squareup.kotlinpoet.asTypeName val servicesProperty = PropertySpec.builder( name = "services", type = List::class.asTypeName().parameterizedBy(String::class.asTypeName()) ).build()
方案二:通过ClassName手动指定
如果需要更明确的类路径(比如区分不同包下的List),可以用ClassName来构建:
import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.PropertySpec val listClassName = ClassName("kotlin.collections", "List") val stringClassName = ClassName("kotlin", "String") val servicesProperty = PropertySpec.builder( name = "services", type = listClassName.parameterizedBy(stringClassName) ).build()
本质上是因为JVM的类型擦除机制,运行时无法直接获取泛型参数的具体类型,所以必须手动通过Kotlin Poet的API来组合原始类型与泛型参数,才能正确生成带泛型的属性定义。
内容的提问来源于stack exchange,提问作者Jamshed Alam Qaderi
相关产品推荐
相关产品推荐

