包
collection
使用类似于以下代码的内容,但我不知道为什么它不适用于整数和双精度。但它适用于字符串、持续时间、日期时间。
extension ListExtensionSort<T> on List<T> {
void sortByDescOrder<K extends Comparable<K>>(K Function(T element) keyOf,
[int start = 0, int? end]) {
sort((b, a) => keyOf(a).compareTo(keyOf(b)));
}
}
void main() {
List<Person> people = [
Person('Alice', 30),
Person('Bob', 25),
Person('Charlie', 35),
];
(24).compareTo(56);
// Sort by age in ascending order
people.sortByDescOrder((person) => person.age); // does not work
people.sortByDescOrder((person) => person.name); // does work
// Print sorted list
people.forEach((person) {
print('${person.name}: ${person.age}');
});
}
无法推断类型参数“K”。试图推断“K”的“int” 不起作用:类型参数“K”被声明为扩展“Comparable” 产生“可比较”。类型“int”是从以下内容推断出来的: 参数“keyOf”声明为“K Function(Person)”,但参数是 'int 函数(人)'。
更新:
我找到了一个过于丑陋的解决方案
people.sortByDescOrder((person) {
num age = person.age;
return age;
});
问题是
int
和double
都没有直接实现Comparable
接口。它们都扩展了 num
,这确实阻碍了 Comparable<num>
接口。
这意味着,虽然它正确地将
K
的类型推断为 int
,但它并不遵守 Comparable<int>
的边界
这里实际上有一个关于此的开放问题:https://github.com/dart-lang/sdk/issues/43763
要解决此问题,您可以自己提供泛型类型:
people.sortByDescOrder<num>((person) => person.age);