如何使用KotlinPoet为父类构造函数传递参数?
KotlinPoet生成子类时传递父类构造参数的正确方式
现有抽象类定义:
abstract class Foo(val foo: String)
需要通过KotlinPoet生成如下实现类:
class Bar(val bar: String) : Foo("I am bar")
修正后的正确实现代码
// 构建主构造函数,注意调用build()完成构建 val constructorSpec = FunSpec.constructorBuilder() .addParameter("bar", String::class) .build() // 构建bar属性 val propertySpec = PropertySpec.builder("bar", String::class) .initializer("bar") .build() // 构建Bar类,注意移除链式调用中多余的点 val classSpec = TypeSpec.classBuilder("Bar") .superclass(Foo::class) .primaryConstructor(constructorSpec) .addSuperclassConstructorParameter(CodeBlock.of("%S", "I am bar")) // 正确传递父类构造参数 .addProperty(propertySpec) .build()
简化写法(无需单独创建PropertySpec)
可以直接在构造函数参数里标记为val,省去单独创建属性的步骤:
val constructorSpec = FunSpec.constructorBuilder() .addParameter("bar", String::class, KModifier.VAL) .build() val classSpec = TypeSpec.classBuilder("Bar") .superclass(Foo::class) .primaryConstructor(constructorSpec) .addSuperclassConstructorParameter(CodeBlock.of("%S", "I am bar")) .build()
原方法失败原因说明
- 第一种方法:你原代码中
classSpec的链式调用多了一个多余的.,导致代码执行异常;另外需确保所有配置完成后调用build()。 - 第二种方法:
callSuperConstructor适用于在构造函数体内调用父类构造的场景(比如次级构造函数),而此处需要在类头的继承声明中传递参数,因此不适用。
内容的提问来源于stack exchange,提问作者JJaviMS
相关产品推荐
相关产品推荐

