gpt4 book ai didi

generics - 当列表文字的元素与声明的泛型类型不匹配时,不会报告类型错误。为什么?

转载 作者:行者123 更新时间:2023-12-04 15:11:36 25 4
gpt4 key购买 nike

我一直在浏览 Dart By Example 中 Shailen Tuli 的片段集。 ,当我遇到以下代码时:

List<String> fruits = [
{'name': 'apple', 'selected': true},
{'name': 'banana', 'selected': true},
{'name': 'kiwi', 'selected': false}
];

请注意 fruits被声明为 List<String>但列表元素实际上是 map 。

问题:为什么没有报类型错误?

最佳答案

如果代码示例是用强静态类型语言编写的,则会报告错误。但是 Dart 是:

  • 动态类型 语言与
  • 基于“ 类型启发式乐观系统 ” 1.
  • 的静态类型检查

    考虑这个声明:

    List<num> lst = [4, "ty-two"];

    理解数组文字 [4, "ty-two"] 很重要。 ,如给定,类型为 List<dynamic> ,其中 dynamic静态类型 当静态类型系统不知道它是什么时(例如,用户没有声明静态类型),或者不想费心进行更深入的分析以找出可能是什么类型时,归因于表达式——如列表中的泛型参数就是这种情况 lst .

    如果您像这样声明文字列表元素的预期静态类型,静态类型系统只能帮助指出存在类型错误:

    List<num> lst = <num>[4, "tytoo"];
    List<String> fruits = <Map>[{'name': 'apple', ...}, ...];

    现在,在这两种情况下都会报告类型错误。在 lst的情况下乐观系统可以很容易地分辨出 String "ty-two"永远不能是 num 类型.类似备注适用于 fruits .另一方面,如果我们有

    var a = "tytoo";
    List<num> lst = <num>[4, a];

    var 声明一个变量有效地意味着(对于静态类型检查器) a类型为 dynamic .因此,在对 lst 的赋值中没有报告错误。 .

    详细信息在 Language Specification 中给出和这两个(恕我直言) 优秀文章 ;他们解释了在 Dart 中打字的同时还涵盖了 基本原理在与类型系统相关的语言设计决策背后。

    ——

    1 https://www.dartlang.org/articles/why-dart-types/
    2 https://www.dartlang.org/articles/optional-types/

    关于generics - 当列表文字的元素与声明的泛型类型不匹配时,不会报告类型错误。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21506541/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com