Есть ли в Dart примитивные типы данных?

«Есть ли в Dart примитивные типы данных?» — вопрос из категории Dart Core, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, в Dart нет примитивных типов в традиционном понимании. Все типы — это объекты, наследуемые от класса Object. Это фундаментальное отличие от языков вроде Java или C#.

Примеры «примитивов», которые на самом деле объекты:

int age = 30;           // Объект класса int
double price = 99.99;   // Объект класса double
bool isActive = true;   // Объект класса bool
String name = 'Flutter'; // Объект класса String

Что это значит на практике:

  1. Можно вызывать методы у «примитивов»:

    int number = 42;
    print(number.isEven); // true - метод объекта int
    print(3.14.floor()); // 3 - метод объекта double
    print('Dart'.toUpperCase()); // 'DART' - метод объекта String
  2. Можно использовать в коллекциях, требующих объектов:

    List<Object> objects = [1, 'text', true]; // Все элементы — объекты
    Set<int> numbers = {1, 2, 3}; // int работает как объект в Generics
  3. Null safety работает единообразно:

    int? nullableInt = null; // int? — nullable тип объекта
    String? nullableString = null;

Сравнение с другими языками:

  • Java/C#: int (примитив) vs Integer (объект), нужна autoboxing.
  • Dart: только int как объект, никакого autoboxing не требуется.

Зачем такой дизайн в Dart:

  • Простота языка — единая модель для всех типов.
  • Лучшая интеграция с системой типов — особенно с Generics.
  • Предсказуемое поведение — нет сюрпризов с autoboxing/unboxing.

В моём Flutter-проекте это означает, что я могу единообразно работать со всеми типами данных, не задумываясь о том, примитив это или объект.