如何避免导入同一文件中定义的类?(Kotlin代码生成场景)
解决KotlinPoet生成无效MyClass导入的问题
问题原因
你在定义Lambda参数时,用new ClassName("", "MyClass")手动创建了类引用,但KotlinPoet无法识别这个类是当前文件内即将声明的类型,会默认把它当成外部依赖类,因此自动生成了多余的import MyClass,导致编译错误。
解决方法
不要手动创建MyClass的ClassName,而是先构建好MyClass的TypeSpec实例,再通过ClassName.get()获取它的类型引用,这样KotlinPoet就能识别这是当前文件内的类,不会生成无效导入。
修改后的代码
// 先构建MyClass的TypeSpec实例 TypeSpec myClassSpec = TypeSpec.classBuilder("MyClass").build(); // 通过已构建的TypeSpec获取对应的类型引用 ClassName myClassType = ClassName.get(myClassSpec); // 构建函数时使用这个关联好的类型 FunSpec.Builder funBuilder = FunSpec.builder(funName); funBuilder.receiver(new ClassName("", "DoesntMatter")); funBuilder.addParameter("i", LambdaTypeName.get( myClassType, new ArrayList<>(), TypeNames.UNIT)); // 组装最终的FileSpec FileSpec.Builder fileBuilder = FileSpec.builder(packageName, model.getName()) .addType(myClassSpec) .addFunction(funBuilder.build());
生成的正确代码
import DoesntMatter class MyClass {} fun DoesntMatter.function(i: MyClass.() -> Unit) {}
内容的提问来源于stack exchange,提问作者iMashtak
相关产品推荐
相关产品推荐

