You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:18:31