如何生成一个类,该类扩展了使用kotlinpoet实现通用接口的类

Luk*_*asz 2 kotlin kotlinpoet

给定一个像

interface Builder<R> {
    fun build() : R
}
Run Code Online (Sandbox Code Playgroud)

如何生成一个BooBuilder使用kotlinpoet实现此接口的类。

我在文档中找不到创建通用接口(或类)的示例。

我想从什么开始

class BooBuilder(): Builder<Boo> { //...
Run Code Online (Sandbox Code Playgroud)

我明白我应该从

TypeSpec
  .classBuilder("BooBuilder")
  .addSuperinterface( /* I have no idea what to put here */ )
  // add methods
Run Code Online (Sandbox Code Playgroud)

Oma*_*gra 5

您可以将ParameterizedTypeName作为参数传递给addSuperinterface。要创建ParameterizedTypeName您可以使用KClass<*>.parameterizedBy扩展功能

import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy


val booKClass = Boo::class

val booBuilderType = TypeSpec
    .classBuilder("BooBuilder")
    .addSuperinterface(Builder::class.parameterizedBy(booKClass))
    .addFunction(
        FunSpec.builder("build")
            .addModifiers(KModifier.OVERRIDE)
            .addStatement("TODO()")
            .returns(booKClass)
            .build()
    )
    .build()

val kotlinFile = FileSpec.builder("com.example", "BooBuilder")
    .addType(booBuilderType)
    .build()

kotlinFile.writeTo(System.out)
Run Code Online (Sandbox Code Playgroud)

输出量

package com.example    

class BooBuilder : Builder<Boo> {
    override fun build(): Boo {
        TODO()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢。一条附加信息,供以后阅读的任何人使用。您需要`导入com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy` (2认同)