Kotlin通用集合强制转换
我是Kotlin的新手,正在研究一个简单的方法,该方法可以对列表进行排序并将其连接到字符串Kotlin通用集合强制转换,kotlin,Kotlin,我是Kotlin的新手,正在研究一个简单的方法,该方法可以对列表进行排序并将其连接到字符串 private fun generateKey(params: Array<Any>): String { val genericCollection = if (params.isNotEmpty() && params[0] is Collection<*>) params[0] as Collection<*>
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 = "_")
}
private-fun-generateKey(参数:数组):字符串{
val genericCollection=if(params.isNotEmpty()&¶ms[0]是集合)params[0]作为集合
else抛出异常(“没有为keyGenerator提供参数”)
返回genericCollection.sortedBy{it}.joinToString(separator=“\”)
}
但我有一个编译错误:
中为R绑定的类型参数
inline fun>Iterable.sortedBy(交叉内联
选择器:(T)→ R?:列表
不满足:推断类型Any不是的子类型
可比
您知道如何解决此问题吗?问题是您尝试通过
it
对此集合进行排序。但是它可以是任何类型的实例。
然而,Any
不是可以比较的东西(Any
没有实现Comparable
接口)
因此,当您使用sortedBy
方法时,您必须提供一些可以比较的东西。例如:
return genericCollection.sortedBy { it.hashCode() }.joinToString(separator = "_")
hashCode()
返回Int
和Int
可以很容易地进行比较
事实上,除非您将
用作泛型类型,否则您将无法找到更好的方法来比较集合。问题是您试图通过对集合进行排序。但是它可以是任何类型的实例。
然而,Any
不是可以比较的东西(Any
没有实现Comparable
接口)
因此,当您使用sortedBy
方法时,您必须提供一些可以比较的东西。例如:
return genericCollection.sortedBy { it.hashCode() }.joinToString(separator = "_")
hashCode()
返回Int
和Int
可以很容易地进行比较
事实上,除非您将
用作泛型类型,否则您将无法找到更好的方法来比较集合。猜一猜,您必须了解,您对param[0]的确切期望是什么。在这种情况下,它必须是一些keyGenerator参数。很确定,这些参数可以是字符串或数字类型。您所需要的只是通过强制转换将它们映射到适当的类。例如,字符串类:
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 = "_")
}
private-fun-generateKey(参数:数组):字符串{
val genericCollection=if(params.isNotEmpty()&¶ms[0]是集合)params[0]作为集合
else抛出异常(“没有为keyGenerator提供参数”)
返回genericCollection.map{it as String}.sortedBy{it}.joinToString(separator=“\u1”)
}
猜一猜,您必须理解,您对param[0]的期望到底是什么。在这种情况下,它必须是一些keyGenerator参数。很确定,这些参数可以是字符串或数字类型。您所需要的只是通过强制转换将它们映射到适当的类。例如,字符串类:
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 = "_")
}
private-fun-generateKey(参数:数组):字符串{
val genericCollection=if(params.isNotEmpty()&¶ms[0]是集合)params[0]作为集合
else抛出异常(“没有为keyGenerator提供参数”)
返回genericCollection.map{it as String}.sortedBy{it}.joinToString(separator=“\u1”)
}
谢谢您的回答,您是否有更好的方法实现的想法?请使用其他类型。如果不提供如何对集合进行排序的信息,则无法对集合进行排序。您将如何对任何类型的集合进行排序?我的意思是,不是实现,但你会使用什么属性?谢谢你的回答,你有没有更好的方法实现的想法?使用其他类型。如果不提供如何对集合进行排序的信息,则无法对集合进行排序。您将如何对任何类型的集合进行排序?我的意思是,不是实现,但你会使用什么属性?