Как строгая типизация в Java проявляется в работе с примитивными типами?

«Как строгая типизация в Java проявляется в работе с примитивными типами?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Строгая (статическая) типизация Java требует явного объявления типа переменной и проверяет совместимость типов на этапе компиляции. Для примитивных типов (int, double, boolean, char и др.) это означает:

  1. Запрет неявных сужающих преобразований (lossy conversion). Компилятор не позволит автоматически присвоить значение типа с большей емкостью переменной с меньшей, так как это может привести к потере данных.
    double price = 100.99;
    // int cost = price; // ОШИБКА КОМПИЛЯЦИИ: возможна потеря точности
    int cost = (int) price; // Требуется явное приведение типа (cast)
  2. Разрешены только безопасные неявные расширяющие преобразования (например, intlong, floatdouble).
  3. Отсутствие автоматического приведения к boolean. В отличие от C/C++, числовые типы или указатели не конвертируются в true/false.
    int flag = 1;
    // if (flag) { ... } // ОШИБКА КОМПИЛЯЦИИ: требуется boolean
    if (flag != 0) { ... } // Корректно
  4. Примитивы не могут иметь значение null. Это гарантирует от NullPointerException при работе с ними, но требует использования классов-оберток (Integer, Double) для представления "отсутствующего" значения.

Сравнение с ссылочными типами: Для объектов правила приведения строже — требуется не только явный cast, но и проверка на совместимость классов (instanceof). Примитивы же участвуют в численных promotion rules, определенных в JLS.