Дарт Карта Ключ Тип Безопасность - PullRequest
1 голос
/ 12 марта 2020

Я реализовал перечисления в качестве ключей для моих карт, но я обнаружил, что 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 Ответ

1 голос
/ 12 марта 2020

Нет, это не ошибка. Здесь вы можете проверить, что вы вызываете, когда выполняете что-то вроде petNames[1] или petNames['two']. Внутри Dart принимает значение в квадратных скобках как Object, потому что вы используете оператор [].

Когда вы проверяете определение Map , вы видите, что оно определено как Тип Generi c (с параметрами K и V). Например, когда вы назначаете какое-то значение некоторой клавише на этой карте:

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

Вы используете оператор []=, и этот оператор вызывает функцию isValidKey(), чтобы проверить, является ли клавиша (Animal.Bird в пример) имеет тип K (Animal), а значение ('New Bird Name' в примере) имеет тип V (String).

Но функция isValidKey() не вызывается при использовании оператора [].

Таким образом, как и в Dart, все является объектом, а оператор [] получает в качестве ввода Object, когда вы звоните petNames['two'], Дарт попытается найти этот ключ, даже если он не имеет типа K.

Для получения дополнительной информации, пожалуйста, проверьте ссылки выше и эту проблему на Dart Lang SDK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...