Использование дженериков Kotlin where для возвращаемого типа свойства - PullRequest
0 голосов
/ 15 октября 2019

Можно ли использовать обобщенное предложение Kotlin where для типа возвращаемого значения свойства?

Если да, то как?

Я использовал его для возвращаемых типов функций, но не могу заставить его работать для свойств, поэтому я предполагаю, что он не будет работать со свойствами.

Мне это нужно, потому что у меня есть несколько иерархий, которые должны реализовывать мои свойства моих объектов. Я реализую их, используя <interface> by <class> состав делегирования в классе extends / Implements.

Проблема заключается в том, что я хочу предоставить ограниченный API классов реализации для определенного кода (а не для полного API), которыйЯ хотел бы сделать через ограниченные интерфейсы. Единственная проблема заключается в том, что, хотя я могу использовать состав делегирования для реальных object: s, я не могу использовать его только для интерфейсов.

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Вы можете поместить предложение where после спецификации типа свойства:

val <T> T.size: Int where T : CharSequence
    get() = this.length

Обратите внимание, что свойство может объявлять только общий тип, который выводится из его получателя, потому что нет синтаксиса для вызова такого свойства, определяющеговведите аргумент явно. Поэтому свойства с общими параметрами могут быть только свойствами расширения.

0 голосов
/ 18 октября 2019

Можно использовать предложение Kotlin generics where для возвращаемого типа свойства, только если параметр типа может быть выведен из типа получателя. В противном случае не будет никакого способа указать универсальный тип при использовании свойства.

Примеры:

  1. T выведено из Итерируемого типа:
val <T> Iterable<T>.firstNotEmpty: T where T : CharSequence?
    get() = first { !it.isNullOrEmpty() }
Ошибка компиляции - параметр типа свойства должен использоваться в типе получателя :
inline val <reified T> Iterable<*>.firstIntsanceOf: T where T : Any
    get() = first { it is T } as T
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...