【问题标题】:Kotlin generic Collection castKotlin 通用 Collection 演员表
【发布时间】:2019-03-10 04:58:42
【问题描述】:

我是 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 in

inline fun > Iterable.sortedBy (crossinline 选择器:(T) → R? ) : 列表

不满足:推断类型 Any 不是 可比

知道如何解决这个问题吗?

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    问题是您尝试通过it 对该集合进行排序。但是it 可以是任何类型的实例。 Any 但是不是可以比较的东西(Any 没有实现 Comparable 接口)。

    所以,当你使用sortedBy 方法时,你必须提供一些可以比较的东西。例如:

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

    hashCode() 返回IntInt 可以很容易地比较。

    事实上,除非您使用 &lt;*&gt; 作为泛型类型,否则您将无法找到更好的比较集合。

    【讨论】:

    • 感谢您的回答,您知道此方法的更好实现方式吗?
    • 使用其他类型。如果不提供如何操作的信息,您将无法对集合进行排序。您将如何对任何类型的集合进行排序?我的意思是,不是实现,而是你会使用什么属性?
    【解决方案2】:

    猜猜,你必须明白,你对 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 = "_")
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-23
      • 2018-04-10
      • 2022-01-06
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多