如何在Kotlin Poet中为参数化类型添加星投影?
在Kotlin Poet中实现星投影参数化类型
不用纠结官方文档没明确说明,Kotlin Poet其实已经支持星投影,核心就是用WildcardTypeName.STAR替代泛型参数。下面是具体实现方案和示例:
生成简单星投影类型(比如
List<*>):val starListType = ParameterizedTypeName.get( List::class.asClassName(), WildcardTypeName.STAR )生成混合星投影的类型(比如
Map<*, String>):val mixedMapType = ParameterizedTypeName.get( Map::class.asClassName(), WildcardTypeName.STAR, String::class.asClassName() )生成嵌套星投影的类型(比如
List<List<*>>):val nestedStarType = ParameterizedTypeName.get( List::class.asClassName(), ParameterizedTypeName.get(List::class.asClassName(), WildcardTypeName.STAR) )
完整生成代码示例
比如生成一个返回List<*>的函数:
val funSpec = FunSpec.builder("getMixedList") .returns(starListType) .addStatement("return listOf(1, \"hello\", 3.14)") .build() val fileSpec = FileSpec.builder("com.example", "StarProjectionDemo") .addFunction(funSpec) .build() fileSpec.writeTo(System.out)
这段代码会生成如下Kotlin代码:
package com.example fun getMixedList(): List<*> { return listOf(1, "hello", 3.14) }
本质上,WildcardTypeName.STAR就是Kotlin Poet专门用于表示星投影的类型对象,直接在参数化类型的泛型参数位置传入它就能实现你要的效果。
内容的提问来源于stack exchange,提问作者vignesh suresh
相关产品推荐
相关产品推荐

