【问题标题】:Dart Map Key Type Safety飞镖映射键类型安全
【发布时间】:2020-03-11 21:44:40
【问题描述】:

我已将枚举实现为我的地图的键,但我发现 Dart 在检索值时不提供类型安全。

例如,以下代码不会导致编译错误:

enum Animal {Bird, Cat, Dog, Horse}

Map<Animal, String> petNames = {
  Animal.Bird: 'Lucky',
  Animal.Cat: 'Cleo',
  Animal.Dog: 'Spot',
  Animal.Horse: 'Sleven',
};

String birdName = petNames[Animal.Bird]; // Positive test
String catName = petNames[1]; // What I want to test
String dogName = petNames['two']; // My control, I expected a compilation error

print(birdName); // Output as expected: Lucky
print(catName); // Output is null
print(dogName); // Output is null

这是 Dart 的缺陷吗?

【问题讨论】:

    标签: android-studio flutter dart


    【解决方案1】:

    不,这不是错误。 Here 你可以在执行petNames[1]petNames['two'] 之类的内容时检查你在调用什么。在内部,Dart 将方括号内的值视为 Object,因为您使用的是 [] 运算符。

    当您检查Map definition 时,您可以看到它被定义为通用类型(带有参数KV)。例如,当您为该地图上的某个键分配一些值时:

    petNames[Animal.Bird] = 'New Bird Name'
    

    您正在使用运算符[]= 并且该运算符调用函数isValidKey() 来检查键(示例中为Animal.Bird)是否为KAnimal)类型和值(@987654336)示例中的 @) 是 V (String) 类型。

    但是当您使用[] 运算符时,不会调用isValidKey() 函数。

    所以,就像在 Dart 中所有都是对象一样,[] 运算符作为输入得到一个 Object,当你调用 petNames['two'] 时,Dart 会尝试找到那个键,即使它不是 @ 类型987654344@.

    有关更多信息,请查看上面的链接以及 Dart Lang SDK 上的 issue

    【讨论】:

    • 很好的答案!我试图找到一个没有运气的问题;谢谢分享!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2021-06-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多