Kotlin多标准排序不编译

这个简单的场景

data class Person(var name:String, var age:Int) var people = listOf( Person("Adam", 36), Person("Boris", 18), Person("Claire", 36), Person("Adam", 20), Person("Jack", 20) ) println(people.sortedBy{compareBy{Person::age, Person::name}}) 

不用编译

错误:(27,29)Kotlin:类型推断失败:没有足够的信息推断inline> fun compareBy(crossinline selector:(T) – > Comparable <*>?)比较器请明确指定它。

将其更改为

 println(people.sortedBy{compareBy<Person>{Person::age, Person::name}}) 

不工作,也没有工作

 println(people.sortedBy{compareBy<Person>{Person::age}.thenBy { Person::name }}) 

错误:(28,20)Kotlin:内联fun类型参数绑定到R> Iterable.sortedBy(十字交叉选择符:(T) – > R?):不满足列表:推测类型Comparator不是Comparable>

那么我也尝试了多功能重载

 println(people.sortedBy{compareBy<Person>({it.age}, {it.name})}) 

这就产生了

错误:(28,20)Kotlin:内联fun类型参数绑定到R> Iterable.sortedBy(十字交叉选择符:(T) – > R?):不满足列表:推测类型Comparator不是Comparable>

而且,如果我也为sortedBy添加类型参数,那更有趣

 println(people.sortedBy<Person>{compareBy<Person>({it.age}, {it.name})}) 

这产生完全相同的问题,即,

错误:(28,20)Kotlin:内联fun类型参数绑定到R> Iterable.sortedBy(十字交叉选择符:(T) – > R?):不满足列表:推测类型Comparator不是Comparable>

我究竟做错了什么?

sortedWithsortedBy之间的区别所愚弄。 原来sortedBy使用单个标准(例如sortedBy(Person::name) ),而如果你想要多个标准,你需要sortedWith

 people.sortedWith(compareBy(Person::age, Person::name)) // or people.sortedWith(compareBy({ it.age }, { it.name }))