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”
答案 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}}对象和元素。