【问题标题】:How to generate a class with a typealias parameter via kotlinpoet如何通过 kotlinpoet 生成具有 typealias 参数的类
【发布时间】:2020-01-27 10:33:20
【问题描述】:

我想用 typealias 生成一个 kotlin 类定义。

typealias MyAlias = BigDecimal
class TemplateState(var test: MyAlias) {
}

有什么建议吗?

【问题讨论】:

    标签: kotlin kotlinpoet


    【解决方案1】:

    你可以在documentation找到它:

    //create a TypeAlias and store it to use the name later
    val typeAlias = TypeAliasSpec.builder("MyAlias", BigDecimal::class).build()
    val type = TypeSpec.classBuilder("TemplateState").primaryConstructor(
        FunSpec.constructorBuilder().addParameter(
            //You can use the ClassName class to get the typeAlias type
            ParameterSpec.builder("test", ClassName("", typeAlias.name)).build()
        )
    ).build()
    FileSpec.builder("com.example", "HelloWorld")
        .addTypeAlias(typeAlias)
        .addType(type)
        .build()
    

    【讨论】:

    • 不,这将自己生成一个类型别名。但我需要一个带有 typealias 的类定义,例如:class TemplateState(var test: MyAlias)
    • @Sahka 我添加了完整的实现。我没有 IDE,所以请原谅拼写错误。
    • @NicoHaase 是的。
    • @SaeedEntezari 仍然没有...这是您的代码生成的结果 package com.example import java.math.BigDecimal typealias MyAlias = BigDecimal class TemplateState( test: BigDecimal ) 简而言之:typeAlias.type只返回原始类型...
    • 你能检查一下这个吗? @Sahka
    【解决方案2】:

    KotlinPoet 并不真正关心 ClassName 是代表 typealias 还是真实类型。在您的情况下,ClassName("", "MyAlias")(假设 MyAlias 在默认包中声明)足以用作构造函数参数的类型。当然,您需要单独生成typealias,以确保生成的代码能够编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多