如何使用 kotlinpoet 生成具有单个类型参数的 Kotlin "Unit" 类型的构造函数参数?
How do I generate a constructor parameter of the Kotlin "Unit" type with a single type parameter with kotlinpoet?
这对于在此处发布可能有点过于具体,但我正在尝试使用 kotlinpoet 生成这样的 class:
class Query<out E: Model>(val onSuccess: (E) -> Unit, val onError: (Int, String) -> Unit = { i, m -> })
如何使用 kotlinpoet 创建 type/constructor 参数? docs 确实有“Unit
”类型与基本类型一起列出,所以它似乎是一个特例。
很简单,使用 LambdaTypeName
class 即可完成。在习惯了 kotlin 的函数式类型样式而不是 java 严格的函数式接口之后,这有点令人困惑。这是我使用的:
val typeVariable = TypeVariableName.invoke("E")
.withBounds(QueryData::class)
ParameterSpec.builder("onSuccess",
LambdaTypeName.get(null, listOf(typeVariable), UNIT)).build()
生成(当然是 class 生成器):
class Query<E : QueryData> {
constructor(onSuccess: (E) -> Unit) {
}
}
这是一个产生您需要的输出的程序:
class Model
fun main(args: Array<String>) {
val onSuccessType = LambdaTypeName.get(
parameters = TypeVariableName(name = "E"),
returnType = Unit::class.asTypeName())
val onErrorType = LambdaTypeName.get(
parameters = listOf(Int::class.asTypeName(), String::class.asTypeName()),
returnType = Unit::class.asTypeName())
val primaryConstructor = FunSpec.constructorBuilder()
.addParameter(ParameterSpec.builder(name = "onSuccess", type = onSuccessType)
.build())
.addParameter(ParameterSpec.builder(name = "onError", type = onErrorType)
.defaultValue("{ i, m -> }")
.build())
.build()
val querySpec = TypeSpec.classBuilder("Query")
.addTypeVariable(TypeVariableName(name = "out E", bounds = Model::class))
.addProperty(PropertySpec.builder(name = "onSuccess", type = onSuccessType)
.initializer("onSuccess")
.build())
.addProperty(PropertySpec.builder(name = "onError", type = onErrorType)
.initializer("onError")
.build())
.primaryConstructor(primaryConstructor)
.build()
val file = KotlinFile.builder(packageName = "", fileName = "test")
.addType(querySpec)
.build()
file.writeTo(System.out)
}
这将打印(不包括生成的导入)以下内容:
class Query<out E : Model>(val onSuccess: (E) -> Unit,
val onError: (Int, String) -> Unit = { i, m -> })
我在这里破解 TypeVariableName
作为 out E
,因为当时似乎没有更好的解决方案。我也在使用 0.4.0-SNAPSHOT
版本。
这对于在此处发布可能有点过于具体,但我正在尝试使用 kotlinpoet 生成这样的 class:
class Query<out E: Model>(val onSuccess: (E) -> Unit, val onError: (Int, String) -> Unit = { i, m -> })
如何使用 kotlinpoet 创建 type/constructor 参数? docs 确实有“Unit
”类型与基本类型一起列出,所以它似乎是一个特例。
很简单,使用 LambdaTypeName
class 即可完成。在习惯了 kotlin 的函数式类型样式而不是 java 严格的函数式接口之后,这有点令人困惑。这是我使用的:
val typeVariable = TypeVariableName.invoke("E")
.withBounds(QueryData::class)
ParameterSpec.builder("onSuccess",
LambdaTypeName.get(null, listOf(typeVariable), UNIT)).build()
生成(当然是 class 生成器):
class Query<E : QueryData> {
constructor(onSuccess: (E) -> Unit) {
}
}
这是一个产生您需要的输出的程序:
class Model
fun main(args: Array<String>) {
val onSuccessType = LambdaTypeName.get(
parameters = TypeVariableName(name = "E"),
returnType = Unit::class.asTypeName())
val onErrorType = LambdaTypeName.get(
parameters = listOf(Int::class.asTypeName(), String::class.asTypeName()),
returnType = Unit::class.asTypeName())
val primaryConstructor = FunSpec.constructorBuilder()
.addParameter(ParameterSpec.builder(name = "onSuccess", type = onSuccessType)
.build())
.addParameter(ParameterSpec.builder(name = "onError", type = onErrorType)
.defaultValue("{ i, m -> }")
.build())
.build()
val querySpec = TypeSpec.classBuilder("Query")
.addTypeVariable(TypeVariableName(name = "out E", bounds = Model::class))
.addProperty(PropertySpec.builder(name = "onSuccess", type = onSuccessType)
.initializer("onSuccess")
.build())
.addProperty(PropertySpec.builder(name = "onError", type = onErrorType)
.initializer("onError")
.build())
.primaryConstructor(primaryConstructor)
.build()
val file = KotlinFile.builder(packageName = "", fileName = "test")
.addType(querySpec)
.build()
file.writeTo(System.out)
}
这将打印(不包括生成的导入)以下内容:
class Query<out E : Model>(val onSuccess: (E) -> Unit,
val onError: (Int, String) -> Unit = { i, m -> })
我在这里破解 TypeVariableName
作为 out E
,因为当时似乎没有更好的解决方案。我也在使用 0.4.0-SNAPSHOT
版本。