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

Dart中按整数排序对象时泛型扩展报错的问题排查

问题解决:List泛型扩展sortByDescOrder对int/double类型的类型推断问题

问题根源

你遇到的问题是Dart中int和double的Comparable实现特性导致的:

  • String、DateTime、Duration这些类型直接实现了Comparable<自身类型>(比如String extends Comparable<String>),符合你的扩展中K extends Comparable<K>的约束。
  • 但int和double实现的是Comparable<num>,而非Comparable<int>或Comparable<double>,所以当你传入int类型的字段时,类型推断系统无法匹配K extends Comparable<K>的约束,从而报错。

解决方案

修改扩展的泛型约束,将K extends Comparable<K>调整为K extends Comparable<Object?>,这样就能兼容int/double的Comparable<num>实现。

修改后的扩展代码

extension ListSortByDesc<T> on List<T> {
  void sortByDescOrder<K extends Comparable<Object?>>(K Function(T) keySelector) {
    sort((a, b) => keySelector(b).compareTo(keySelector(a)));
  }
}

测试示例

class Person {
  final String name;
  final int age;
  final double height;

  Person(this.name, this.age, this.height);
}

void main() {
  final people = [
    Person('Alice', 30, 1.65),
    Person('Bob', 25, 1.80),
    Person('Charlie', 35, 1.75),
  ];

  // 按int类型的age降序,正常工作
  people.sortByDescOrder((p) => p.age);
  print(people.map((p) => p.age).toList()); // [35, 30, 25]

  // 按double类型的height降序,正常工作
  people.sortByDescOrder((p) => p.height);
  print(people.map((p) => p.height).toList()); // [1.8, 1.75, 1.65]

  // 按String类型的name降序,依然正常
  people.sortByDescOrder((p) => p.name);
  print(people.map((p) => p.name).toList()); // [Charlie, Bob, Alice]
}

为什么这个修改有效

int实现的Comparable<num>中,num是Object?的子类型,因此int满足K extends Comparable<Object?>的约束,类型推断可以自动完成,无需手动将int转为num,写法更简洁优雅。

内容的提问来源于stack exchange,提问作者TSR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:27:20