Как реализовать Comparable в KotlinPoet?

Представлено Fleshgrinder на GitHub.

Как можно реализовать Comparable для класса, который создается в данный момент?

Есть метод ParameterizedTypeName.get(Comparable::class, ?), но непонятно, как передать второй параметр. Единственное, что доступно при создании класса, это его ClassName.

Минимальный пример:

FileSpec.builder("com.fleshgrinder", "KotlinPoet").apply {
    val className = ClassName("com.fleshgrinder", "KotlinPoet")
    addType(TypeSpec.classBuilder(className).apply {
        addSuperinterface(ParameterizedTypeName.get(Comparable::class, Any::class))
    }.build())
}.build().writeTo(System.out)

Что генерирует:

package com.fleshgrinder

import kotlin.Any
import kotlin.Comparable

class KotlinPoet : Comparable<Any>

Что я хотел бы иметь:

package com.fleshgrinder

class KotlinPoet : Comparable<KotlinPoet>

person Egor    schedule 11.05.2018    source источник


Ответы (1)


ClassName имеет следующий метод расширения:

fun ClassName.parameterizedBy(vararg typeArguments: TypeName)

Вот как вы можете применить его к вашему варианту использования:

val className = ClassName("com.fleshgrinder", "KotlinPoet")
val comparable = Comparable::class.asClassName().parameterizedBy(className)

Обратите внимание, что из-за ошибки IDE вам потребуется вручную добавить следующий импорт:

import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
person Egor    schedule 11.05.2018
comment
Спасибо @АлександрКундрюков, я обновил ответ! - person Egor; 26.06.2019