【问题标题】:Expected a value of type 'List<int>', but got one of type 'WhereIterable<int>'需要一个“List<int>”类型的值,但得到一个“WhereIterable<int>”类型的值
【发布时间】:2020-12-03 11:34:59
【问题描述】:
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 时,会引发错误:

错误:需要一个“List”类型的值,但得到一个“WhereIterable”类型的值

【问题讨论】:

  • WhereIterable 不是List 所以你得到一个错误是有道理的?
  • @julemand101 是WhereIterable 不是Iterable 的子类型并且是List 不是Iterable 的子类型?
  • 是吗? WhereIterableIterableList 也是。但是你不能说IterableList
  • @julemand101 我们也不能说ObjectString,但我们当然可以使用as String,它适用于Object,对吧?
  • 没有?如果你有一个 int 是一个 Object 你不能只说 as String 并期望事情会这样工作......

标签: dart


【解决方案1】:

where 返回一个Iterable(在您的情况下运行时是WhereIterable,它实现了Iterable 接口)。你的问题是你不能说所有Iterable 都是List 但你可以说所有List 对象也是Iterable,因为List 实现了Iterable 接口。

因此,您使用 as List&lt;int&gt; 进行类型转换失败,因为 Dart 在运行时检查类型转换,它可以判断 WhereIterableList 接口不兼容。

toList() 有效,因为这被记录为:

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

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

因此,此方法将返回一个新的List,其中包含返回的WhereIterable 中的所有元素,因为它已经遍历了从Iterable 返回的所有元素,并使用这些元素创建了一个全新的List 对象。

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 2021-11-02
    • 2022-01-08
    • 2021-09-13
    • 2021-03-16
    • 2021-07-13
    • 2021-11-26
    • 2022-12-05
    • 2021-12-04
    相关资源
    最近更新 更多