Как мне сгенерировать класс, который расширяет класс, который реализует универсальный интерфейс, используя kotlinpoet
Учитывая интерфейс как
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 ответ
Решение
Вы можете передать 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()
}
}