#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 }