Generi c ограничение на основе свойства KClass <T>для ограничения функции расширения - PullRequest
3 голосов
/ 12 апреля 2020

Я пишу функцию расширения kotlin, которая должна работать только для закрытых классов. Могу ли я определить Generi c Constraint - или что-то подобное, которое служит той же цели - так, чтобы функция расширения работала только на классах, которые являются запечатанным классом?

В моей спецификации c пример У меня есть функция расширения, которая получает порядковый номер типа класса в своем запечатанном классе:

inline fun <reified T : Any> T.sealedClassOrdinal() = T::class.sealedClassOrdinal()

inline fun <reified T : Any> KClass<T>.sealedClassOrdinal() =
    java.superclass?.classes?.indexOfFirst { sub -> sub == this@sealedClassOrdinal.java } ?: -1

Прямо сейчас первая функция расширения может быть вызвана на Any. Я хотел бы расширить его, чтобы расширить только классы закрытого типа. Свойство isSealed на KClass<T> предоставляет эту информацию, но я не понимаю, как сказать компилятору. Я хочу что-то вроде этого (псевдокод):

inline fun <reified T where T::class.isSealed> T.sealedClassOrdinal() = T::class.sealedClassOrdinal()

и / или

inline fun <reified T : Any> KClass<T>.sealedClassOrdinal() where this.isSealed =

или любое другое решение, которое могло бы достичь такого поведения.

...