飞镖地图键类型安全

时间:2020-03-11 21:44:40

标签: android-studio flutter dart

我已将枚举实现为地图的键,但是我发现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中的缺陷吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

您正在使用运算符[]=,并且该运算符调用函数isValidKey()来检查键(示例中的Animal.Bird)是否为K类型({{ 1}}),值(示例中为Animal)的类型为'New Bird Name'V)。

但是使用String运算符时不会调用isValidKey()函数。

因此,就像在Dart中一样,所有对象都是对象,并且[]运算符得到一个[]作为输入,当您调用Object时,Dart会尝试找到该键,即使它不是petNames['two']类型。

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