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>
我究竟做错了什么?
被sortedWith
和sortedBy
之间的区别所愚弄。 原来sortedBy
使用单个标准(例如sortedBy(Person::name)
),而如果你想要多个标准,你需要sortedWith
:
people.sortedWith(compareBy(Person::age, Person::name)) // or people.sortedWith(compareBy({ it.age }, { it.name }))