Kotlin Generic Collection演员表

时间:2019-03-06 12:34:54

标签: kotlin

我是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的类型参数      

内联乐趣> Iterable.sortedBy(crossinline   选择器:(T)→R? ):列表

     

不满足:推断的类型Any不是以下内容的子类型   可比的

有什么解决方法吗?

2 个答案:

答案 0 :(得分:0)

问题是您尝试通过it对集合进行排序。但是it可以是任何类型的实例。 Any却无法比较(Any未实现Comparable接口)。

因此,当您使用sortedBy方法时,必须提供可以比较的内容。例如:

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

hashCode()返回Int,可以很容易地比较Int

实际上,除非您将<*>用作通用类型,否则您将无法找到更好的比较集合的方式。

答案 1 :(得分:0)

猜想,您必须了解,您对param [0]的确切期望。在这种情况下,它必须是一些keyGenerator参数。可以肯定的是,这些参数可以是String或Numeric类型。您所需要做的就是通过强制转换为适当的类来映射它们。敌人的例子,字符串类:

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 = "_")
    }