Android studio 省道地图键式安全

Android studio 省道地图键式安全,android-studio,flutter,dart,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 = pet

我已经实现了枚举作为映射的键,但我发现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
enum动物{鸟、猫、狗、马}
映射名称={
动物。鸟:“幸运”,
动物。猫:“克莱奥”,
动物。狗:“斑点”,
动物。马:'Sleven',
};
String birdName=petNames[Animal.Bird];//阳性试验
字符串catName=petNames[1];//我想测试什么
字符串dogName=petNames['two'];//在我的控件中,我预期会出现编译错误
打印(鸟名);//输出如预期:幸运
打印(catName);//输出为空
打印(狗名);//输出为空
这是Dart中的一个缺陷吗?

不,它不是一个bug。当您执行类似于
petNames[1]
petNames['two']
的操作时,您可以检查您正在调用什么。在内部,Dart将方括号内的值作为
对象
,因为您使用的是
[]
运算符

当您检查时,您可以看到它被定义为泛型类型(带有参数
K
V
)。例如,当您为该地图上的某个键指定某个值时:

petNames[Animal.Bird]=“新鸟名”
您正在使用运算符
[]=
,该运算符调用一个函数
isValidKey()
,以检查键(
Animal.Bird
在示例中)是否为
K
Animal
)类型,值(
'newbird Name'
在示例中)是否为
V
String
)类型

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

因此,在Dart中,all是一个对象,
[]
操作符作为输入获取一个
对象
,当您调用
petNames['two']
时,Dart将尝试查找该键,即使它不是
K
类型


有关更多信息,请查看上面的链接和Dart Lang SDK上的此链接。

答案很好!我试图追查一个涉及此事的问题,但运气不佳;谢谢分享!