Как мне сгенерировать класс, который расширяет класс, который реализует универсальный интерфейс, используя kotlinpoet - PullRequest
0 голосов
/ 14 декабря 2018

Учитывая интерфейс типа

interface Builder<R> {
    fun build() : R
}

Как мне сгенерировать класс BooBuilder, который реализует этот интерфейс, используя kotlinpoet.

Я не смог найти пример создания универсального интерфейса(или класс) в документации.

то, что я хотел бы начать с

class BooBuilder(): Builder<Boo> { //...

Я понимаю, что я должен начать с

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

1 Ответ

0 голосов
/ 15 декабря 2018

Вы можете передать 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)

Выход

package com.example    

class BooBuilder : Builder<Boo> {
    override fun build(): Boo {
        TODO()
    }
}
...