Функция расширения размера коллекции

#kotlin

#kotlin

Вопрос:

Я пытаюсь реализовать функцию расширения, которая, если размер коллекции больше некоторого значения, запускает некоторый блок кода, но я получаю эту ошибку в Collection<*> части:

Параметр типа не может иметь никаких других ограничений, если он ограничен другим параметром типа

код:

 fun <C, R> C.ifBiggerThan(size: Int, execute: () -> R): R where C : Collection<*>, C : R  =
        if (this.size > size) { execute() } else { this }
 

Есть предложения?

Комментарии:

1. Это сложно обойти, но какой потенциальный тип R вы ожидаете, который будет отличаться от C? Можете ли вы обойтись без использования одного параметра типа коллекции типов?

2. Похоже, вы должны иметь возможность просто заменить R на C .

3. @Tenfour04 на данный момент я ожидаю выдать исключение, но я думаю, что полезно иметь более обобщенную функцию

Ответ №1:

В if ветке вы возвращаетесь R , в else ветке вы возвращаетесь C . Тип результирующего выражения является наиболее специфичным супертипом ветвей if и. else В этом случае это будет R , потому C : R что . Поэтому нет смысла вводить C type как расширение R . Тип результирующего выражения все равно будет R . Итак, вы можете просто заменить его как Collection<T> :

 fun <T> Collection<T>.ifBiggerThan(size: Int, execute: () -> Collection<T>): Collection<T> =
    if (this.size > size) { execute() } else { this }