Переменная «доблесть» имеет тип «Объект».
«доблесть» хранит «Карту <String, String>».
Я могу «преобразовать» доблесть в карту, используя:
var json = valor as Map<String, String>;
Вопрос в том, могу ли я сделать то же самое, не используя as?
Извините, но вы не можете, даже такой метод, как Iterable.cast()
, использует ключевое слово as
под капотом.
Вы можете проверить Документация системы типа Dart для подтверждения.
Вы можете и должны сначала проверить, является ли valor
Map<String, String>
, и разрешить его автоматическое продвижение:
if (valor is Map<String, String>) {
// `valor` is now known to be a `Map<String, String>`.
var json = valor;
...
}
Обратите внимание, что повышение типа может происходить только для локальных переменных, поэтому, если valor
не является локальным, вы должны сначала создать локальную ссылку.
Кастовать можно без явныйas
, пройдя динамику.
dynamic dynamicValue = valor; // Valid up-cast.
Map<String, String> map = dynamicValue; // Implicit down-cast.
Неявное приведение вниз фактически представляет собой as Map<String, String>
, который вставляется компилятором.
При компиляции для Интернета с включенной «ненадежной оптимизацией» неявное приведение оптимизируется, и компилятор просто слепо обрабатывает значение как Map<String, String>
, независимо от того, является ли оно единицей или нет.
Если это ваша цель, чтобы избежать затрат на приведение во время выполнения, вы также можете просто сделать:
Map<String, String> json = valor as dynamic;
Это as
— это восходящее преобразование, которое всегда надежно и не требует дополнительных затрат времени на выполнение.
(В зависимости от конфигурации вашего анализатора вы можете получать предупреждения о неявных преобразованиях вниз.)
Другой подход, который не использует as
, но требует затрат во время выполнения, заключается в использовании продвижения:
Map<String, String> json;
if (valor is Map<String, String>) { // no `as`, but still a check.
json = valor;
} else {
throw UnsupportedError("But it should be a map!");
}
// json is assigned here.
Никакого использования as
, но столько же проверок типов, сколько и as Map<String, String>
, так что, возможно, это не то, что вам нужно.