如何生成 class 扩展 class 使用 kotlinpoet 实现通用接口
How do I generate a class which extends a class which implements a generic interface using kotlinpoet
给定一个类似
的界面
interface Builder<R> {
fun build() : R
}
如何生成使用 kotlinpoet 实现此接口的 class BooBuilder
。
我在文档中找不到关于创建通用接口(或 class)的示例。
我想从什么开始
class BooBuilder(): Builder<Boo> { //...
我明白我应该从
开始
TypeSpec
.classBuilder("BooBuilder")
.addSuperinterface( /* I have no idea what to put here */ )
// add methods
您可以将 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()
}
}
给定一个类似
的界面interface Builder<R> {
fun build() : R
}
如何生成使用 kotlinpoet 实现此接口的 class BooBuilder
。
我在文档中找不到关于创建通用接口(或 class)的示例。
我想从什么开始
class BooBuilder(): Builder<Boo> { //...
我明白我应该从
开始TypeSpec
.classBuilder("BooBuilder")
.addSuperinterface( /* I have no idea what to put here */ )
// add methods
您可以将 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()
}
}