Android studio 省道地图键式安全
我已经实现了枚举作为映射的键,但我发现Dart在检索值时没有提供类型安全性 例如,以下代码不会导致编译错误: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
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上的此链接。答案很好!我试图追查一个涉及此事的问题,但运气不佳;谢谢分享!