Kotlin的compareTo是否支持泛型?泛型Point类实现Comparable报错排查
代码存在两个核心问题
1. 泛型约束不满足比较要求
你当前只给泛型T声明了T: Number的上界,但Kotlin的Number抽象类本身没有实现Comparable接口,而compareValuesBy函数要求参与比较的属性必须实现Comparable才能自动排序。去掉泛型之后你大概率是把x、y固定成了Int、Double这类本身就实现了Comparable的Number子类,所以不会报错。
2. compareValuesBy的选择器写法错误
你在lambda中写的it<T>.x; it<T>.y存在两个问题:
- 不需要给
it加<T>强制类型转换,it本身就是明确的Point<T>类型,强转属于多余写法 - Kotlin的lambda默认返回最后一个表达式的值,你用分号分隔两个属性,lambda只会返回
y属性参与比较,完全没有用到x属性,不符合你要先比x再比y的预期
修正后的代码示例
// 给T加Comparable约束,确保x、y可以直接比较 class Point<T: Number>(val x: T, val y: T): Comparable<Point<T>> where T: Comparable<T> { override fun compareTo(other: Point<T>): Int { // 两个选择器作为独立参数传入,先比x再比y return compareValuesBy(this, other, { it.x }, { it.y }) } }
你也可以在lambda里返回Pair实现相同效果:
return compareValuesBy(this, other) { Pair(it.x, it.y) }
内容的提问来源于stack exchange,提问作者ntos
相关产品推荐
相关产品推荐

