Ссылка на член не работает для maxBy в Kotlin неизменяемом списке - PullRequest
1 голос
/ 24 января 2020

Вот мой код, который не работает:

    val people = listOf(Person("Tarun", 28), Person("Shyam", 25), Person("Pushpraj", 27))
    people.maxBy { Person::age }

Ошибка, которую я получаю для вышеуказанного кода:

Type parameter bound for R in inline fun <T, R : Comparable<R>> Iterable<T>.maxBy(selector: (T) -> R): T? is not satisfied: inferred type KProperty1<Person, Int> is not a subtype of Comparable<KProperty1<Person, Int>>

Рабочий код:

    val people = listOf(Person("Tarun", 28), Person("Shyam", 25), Person("Pushpraj", 27))
    people.maxBy { it.age }

Не в состоянии понять проблему здесь.

1 Ответ

3 голосов
/ 24 января 2020

TL; DR

people.maxBy(Person::age) будет работать (посмотрите в скобках)

Подпись метода

Функция maxBy имеет следующую подпись:

public inline fun <T, R : Comparable<R>> Iterable<T>.maxBy(selector: (T) -> R): T? {

Если вы напишите people.maxBy { Person::age }, это может быть записано как people.maxBy( { Person::age } ), что означает, что вы передаете лямбду, которая возвращает другую лямбду (Поставщик), которая возвращает возраст INT.

Другими словами: вы пропускаете (java Поставщик) лямбду внутри другой лямбды вместо фактической (java Поставщик) лямбды. Это выглядит сбивающим с толку, потому что вы можете удалить нормальные скобки в Kotlin, если последний аргумент в методе является лямбда-выражением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...