Может ли динамический тип в 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 ключевое слово.

Другие вопросы по тегам