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
相关产品推荐
相关产品推荐

