You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:18:02