Котлин универсальный Коллекция литой - PullRequest
0 голосов
/ 06 марта 2019

Я новичок в Kotlin и работаю над простым методом, который сортирует и присоединяет список к строке

private fun generateKey(params: Array<Any>): String {
    val genericCollection  = if (params.isNotEmpty() && params[0] is Collection<*>) params[0] as Collection<*>
                    else throw Exception("no params provided for keyGenerator")

    return genericCollection.sortedBy { it }.joinToString(separator = "_")
}

, но я получил эту ошибку компиляции:

Параметр типаоценка для R в

inline fun> Iterable.sortedBy (перекрестный селектор: (T) → R?): список

не удовлетворен: предполагаемый тип Any не является подтипом Comparable

Есть идеи, как это исправить?

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Угадайте, вы должны понимать, что именно вы ожидаете от param [0]. В этом случае это должны быть некоторые параметры keyGenerator. Уверен, эти параметры могут быть строковыми или числовыми. Все, что вам нужно, это сопоставить их, приведя к соответствующему классу. Например, класс String:

private fun generateKey(params: Array<Any>): String {
        val genericCollection  = if (params.isNotEmpty() && params[0] is Collection<*>) params[0] as Collection<*>
        else throw Exception("no params provided for keyGenerator")

        return genericCollection.map { it as String }.sortedBy { it }.joinToString(separator = "_")
    }
0 голосов
/ 06 марта 2019

Проблема в том, что вы пытаетесь отсортировать эту коллекцию через it. Но it может быть экземпляром любого типа. Any однако это не то, что можно сравнить (Any не реализует Comparable интерфейс).

Итак, когда вы используете sortedBy метод, вы должны предоставить что-то, что можно сравнить. Например:

return genericCollection.sortedBy { it.hashCode() }.joinToString(separator = "_")

hashCode() возвращает Int и Int можно легко сравнить.

Фактически, пока вы не используете <*> в качестве универсального типа, вы не сможете найти что-то лучшее для сравнения коллекции.

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