дженерики в kotlin - тип, который реализует ограничение интерфейса - PullRequest
0 голосов
/ 25 сентября 2018
fun membershipSelected(membershipSelected: List<MemberShipType>) = apply { this.membershipSelected= membershipSelected}


object GOLD: MemberShipType("Gold"), IRateOption{}

object BRONZE: MemberShipType("Bronze"){}

В Kotlin, как я могу ограничить membershipSelected только MembershipTypes, который реализует IRateOption интерфейс?

Например, BRONZE не реализует IRateOption, но GOLD делает так, что только GOLD может быть выбрано как membershipType

1 Ответ

0 голосов
/ 25 сентября 2018

Вам необходимо использовать универсальный шаблон с предложением where, как описано в руководстве Kotlin .Для вашего случая использования это будет выглядеть так:

fun <T> membershipSelected(membershipSelected: List<T>): ReturnType
    where T : MembershipType,
          T : IRateOption {
    // function body
}

Или с сокращенным синтаксисом:

fun <T> membershipSelected(membershipSelected: List<T>) where T : MembershipType, T : IRateOption = // function body

Редактировать : Это решение будет работать, только если всеэлементы в параметре имеют одинаковый тип.Это означает, что вы не сможете использовать два отдельных класса / объекта, которые являются подтипами MembershipType и IRateOption.Если вам нужно такое поведение, я бы порекомендовал создать открытый или абстрактный класс, например:

abstract class RateMembershipType(...) : MembershipType(...), IRateOption

object GOLD: RateMembershipType(...)
object BRONZE: MembershipType(...)

fun membershipSelected(membershipSelected: List<RateMembershipType>) = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...