我是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不是以下内容的子类型 可比的
有什么解决方法吗?
答案 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 = "_")
}