Почему generi c sortBy в Kotlin не компилируется? - PullRequest
0 голосов
/ 05 августа 2020

Почему не компилируется? Он сообщает об ошибке в list.sortBy

fun <T, R : Comparable<R>> Iterable<T>.sortBy(vararg selectors: (T) -> R): List<T> {
  return this.sortedWith(compareBy(*selectors))
}

fun main() {
  class Person(val name: String, val age: Int)
  val list = listOf(Person("Alex", 20))
  val sorted = list.sortBy({ it.name }, { it.age })
  println(sorted)
}

Ошибка

Type parameter bound for R in 

fun <T, R : Comparable<R>> Iterable<T>.sortBy
(
vararg selectors: (T) → R
)
: List<T>
is not satisfied: inferred type Any is not a subtype of Comparable<Any>

1 Ответ

2 голосов
/ 05 августа 2020

Когда он пытается вывести тип R из первой лямбды, это Comparable<String>. Вторая лямбда возвращает Int или Comparable<Int>, что не является Comparable<String>, поэтому он не работает.

Вы можете использовать звездную проекцию для типа Comparable, поскольку не имеет значения, если они совпадение.

fun <T> Iterable<T>.sortBy(vararg selectors: (T) -> Comparable<*>): List<T> {
    return this.sortedWith(compareBy(*selectors))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...