Как создать параметр конструктора типа «Единица» Kotlin с параметром одного типа с kotlinpoet?

Это может быть слишком специфично для публикации здесь, но я пытаюсь создать такой класс с помощью kotlinpoet:

class Query<out E: Model>(val onSuccess: (E) -> Unit, val onError: (Int, String) -> Unit = { i, m -> }) 

Как создать этот параметр type / constructor с помощью kotlinpoet? Документы имеют тип « 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 .

    Достаточно легко, это делается с помощью класса LambdaTypeName . Это было немного запутанно после привыкания к функциональному типу типа kotlin, а не к строго функциональным интерфейсам java. Вот что я использовал:

     val typeVariable = TypeVariableName.invoke("E") .withBounds(QueryData::class) ParameterSpec.builder("onSuccess", LambdaTypeName.get(null, listOf(typeVariable), UNIT)).build() 

    Что генерирует (конечно же, со строителями классов):

     class Query<E : QueryData> { constructor(onSuccess: (E) -> Unit) { } }