为什么toList()在Dart中创建List <dynamic>?

Clo*_*Sun 4 dart

我有这种方法,可以在Dart 2中进行编译,但是在运行时出现以下错误

类型“ List<dynamic>”不是类型的子类型“ List<ExchangeRate>

如您在代码中所见,我在其中创建并返回了新的ExchangeRate对象.map(),然后返回了rateEntries.toList()我希望是type的a List<ExchangeRate>,但是似乎可以推断为type List<dynamic>

@override
Future<List<ExchangeRate>> getExchangeRatesAt(DateTime time, Currency baseCurrency) async {
  final http.Client client = http.Client();
  final String uri = "some uri ...";
  return await client
    .get(uri)
    .then((response) {
      var jsonEntries = json.decode(response.body) as Map<String, dynamic>;
      var rateJsonEntries = jsonEntries["rates"].entries.toList();
      var rateEntries = rateJsonEntries.map((x) {
        return new ExchangeRate(x.value.toDouble());
      });
      return rateEntries.toList(); // WHY IS IT RETURNING A List<dynamic> here?
    })
    .catchError((e) => print(e))
    .whenComplete(() => client.close());
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我专门将其强制转换为ExchangeRate,那会很好。

    return rateEntries.toList().cast<ExchangeRate>();
Run Code Online (Sandbox Code Playgroud)

最后的转换对我来说似乎是多余的,为什么我需要它?

che*_*ins 6

好吧,似乎必须使用强制类型转换来完全定义类型。

但是,如果添加以下任何代码段,则可以避免强制转换:

  1. rateJsonEntries变量提供正确的类型

    List<dynamic> rateJsonEntries = jsonEntries["rates"].entries.toList();

    无论出于何种原因,这对我来说都是行得通的。

  2. 将参数类型添加到map()方法中

    var rateEntries = rateJsonEntries.map<ExchangeRate>((x) { return new ExchangeRate(x.value.toDouble()); });