预期值为'List <int>'类型的值,但得到了'WhereIterable <int>'类型的值

时间:2020-08-13 15:20:09

标签: dart

List<int> filterEvens(List<int> ints) {
  var foo = ints.where((n) => n.isEven) as List<int>;
  var bar = ints.where((n) => n.isEven).toList();

  return foo; // Runtime error
  // return bar; // Works
}

void main() {
  print(filterEvens([1]));
}

当我在上述函数的第一行中将Iterable向下转换为List时,会引发错误:

错误:预期值为“列表”类型,但得到了类型为“ WhereIterable”

1 个答案:

答案 0 :(得分:2)

where返回一个Iterable(在您的运行时中,WhereIterable实现了Iterable接口)。您的问题是您不能说所有Iterable都是List,而是可以说所有List对象也是Iterable,因为List实现了{{ 1}}界面。

因此,由于Dart在运行时检查了类型转换,因此您使用Iterable进行的类型转换失败了,并且可以告诉as List<int>WhereIterable界面不兼容。

List可以正常工作,因为它记录为:

创建一个包含此Iterable元素的列表。

https://api.dart.dev/stable/2.9.1/dart-core/Iterable/toList.html

因此,该方法将遍历从toList()返回的所有元素并创建了一个全新的{{ 1}}对象和元素。