Может ли динамический тип в Dart 2 присваивать нескольким значениям разностный тип?
Может ли динамический тип в Dart 2 присваивать значение разностного типа и как их компилировать?
Например, что такое тип x в dart 2 и это компилируется?
dynamic x = 1;
x = x + "Hello";
2 ответа
dynamic
тип особенный. Это действительно означает "поверь мне, я знаю, что я делаю", и это отключает некоторую статическую проверку типов.
Как ограничение типа, dynamic
действительно эквивалентно Object
(Вы можете присвоить любое значение переменной с типом dynamic
), но когда вы пытаетесь вызвать методы объекта, вы можете попробовать, даже если метод не существует в Object
,
В этом случае, dynamic x = 1;
работает потому что 1
присваивается Object
, Строка 2 не проходит. x = x + "Hello";
пытается позвонить +
метод на 1
с "Hello"
в качестве аргумента, и хотя +
оператор существует, аргумент имеет неправильный тип.
Вы сказали: "Поверьте мне, я знаю, что я делаю", поэтому компилятор позволил вам попробовать - нет статических предупреждений или ошибок. Вы неправильно набрали текст, поэтому время выполнения останавливает вас, прежде чем все станет некачественным. Вы могли бы также написать x.argleBargleGlopGlyf(42)
и компилятор все равно не остановил бы вас, даже если бы не было argleBargleGlopGlyf
метод в любом месте вашей программы. С большой статической силой приходит большая динамическая ответственность.
В дротике 2 dynamic
особый тип подписи - что-то вроде обозначения чего-либо.
В приведенном выше примере x
является dynamic
, Во время выполнения в строке 1 это будет int. Так что если вы напишите print(x is int)
, это будет true
, Однако, статически, это dynamic
, Вы не получите код завершения (попробуйте набрать x.
в IDE.
Следующая строка будет ошибкой во время выполнения (по сравнению со статической ошибкой, если она была напечатана правильно).
По моему опыту, с Dart 2 вы будете редко использовать dynamic
ключевое слово.