如何在 dart 中按 int 排序对象

问题描述 投票:0回答:1

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;
  });
flutter dart
1个回答
0
投票

问题是

int
double
都没有直接实现
Comparable
接口。它们都扩展了
num
,这确实阻碍了
Comparable<num>
接口。

这意味着,虽然它正确地将

K
的类型推断为
int
,但它并不遵守
Comparable<int>

的边界

这里实际上有一个关于此的开放问题:https://github.com/dart-lang/sdk/issues/43763

要解决此问题,您可以自己提供泛型类型:

people.sortByDescOrder<num>((person) => person.age);
© www.soinside.com 2019 - 2024. All rights reserved.