为什么Kotlin中的泛型排序不编译?

为什么Kotlin中的泛型排序不编译?,kotlin,Kotlin,为什么它不能编译?它告诉您在列表中有一些错误。sortBy fun <T, R : Comparable<R>> Iterable<T>.sortBy(vararg selectors: (T) -> R): List<T> { return this.sortedWith(compareBy(*selectors)) } fun main() { class Person(val name: String, val age: In

为什么它不能编译?它告诉您在
列表中有一些错误。sortBy

fun <T, R : Comparable<R>> Iterable<T>.sortBy(vararg selectors: (T) -> R): List<T> {
  return this.sortedWith(compareBy(*selectors))
}

fun main() {
  class Person(val name: String, val age: Int)
  val list = listOf(Person("Alex", 20))
  val sorted = list.sortBy({ it.name }, { it.age })
  println(sorted)
}
funiterable.sortBy(vararg选择器:(T)->R):列表{
返回此.sortedWith(compareBy(*选择器))
}
主要内容(){
类人员(val名称:字符串,val年龄:Int)
val list=listOf(个人(“Alex”,20))
val sorted=list.sortBy({it.name},{it.age})
println(已排序)
}
错误

Type parameter bound for R in 

fun <T, R : Comparable<R>> Iterable<T>.sortBy
(
vararg selectors: (T) → R
)
: List<T>
is not satisfied: inferred type Any is not a subtype of Comparable<Any>
中为R绑定的类型参数
有趣的,卑鄙的
(
vararg选择器:(T)→ R
)
:列表
不满足:推断类型Any不是Compariable的子类型

当它试图从第一个lambda推断出类型
R
时,它是一个
可比的
。第二个lambda返回一个
Int
Comparable
,它不是
Comparable
,因此失败

您可以对
Compariable
类型使用星形投影,因为它们是否匹配并不重要

fun <T> Iterable<T>.sortBy(vararg selectors: (T) -> Comparable<*>): List<T> {
    return this.sortedWith(compareBy(*selectors))
}
funiterable.sortBy(vararg选择器:(T)->compariable):列表{
返回此.sortedWith(compareBy(*选择器))
}

当它试图从第一个lambda推断出类型
R
时,它是一个
可比的
。第二个lambda返回一个
Int
Comparable
,它不是
Comparable
,因此失败

您可以对
Compariable
类型使用星形投影,因为它们是否匹配并不重要

fun <T> Iterable<T>.sortBy(vararg selectors: (T) -> Comparable<*>): List<T> {
    return this.sortedWith(compareBy(*selectors))
}
funiterable.sortBy(vararg选择器:(T)->compariable):列表{
返回此.sortedWith(compareBy(*选择器))
}

始终发布错误消息。它通常是最重要的拼图。@Thomas谢谢,更新并添加了错误消息。始终发布错误消息。它通常是最重要的拼图。@Thomas谢谢,更新,添加了错误消息。