【问题标题】:How do I generate a class which extends a class which implements a generic interface using kotlinpoet如何生成一个类,该类扩展一个使用 kotlinpoet 实现通用接口的类
【发布时间】:2018-12-16 23:07:31
【问题描述】:

给定一个类似的界面

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

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

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

我想从什么开始

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

我知道我应该开始

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

【问题讨论】:

    标签: kotlin kotlinpoet


    【解决方案1】:

    您可以将ParameterizedTypeName 作为参数传递给addSuperinterface。要创建ParameterizedTypeName,您可以使用KClass&lt;*&gt;.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()
        }
    }
    

    【讨论】:

    • 非常感谢。一条附加信息,供将来阅读此内容的任何人使用。你需要import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
    • 是的,@Lukasz,这对我来说也很麻烦,我会更新答案
    • 对,有一个长期存在的 IDE 问题,它不会导入伴随对象中定义的扩展函数,它应该在 1.3.20 中修复。现在,只需手动添加导入。
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 2010-10-13
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多