Что верно про var (Java 10)?
- Что такое var в Java?
- Делает ли var Java динамически типизированной?
- Где нельзя использовать var?
- Когда var делает код лучше, а когда хуже? Расскажи, как он устроен и где ограничен.
var — статический вывод типа компилятором из инициализатора; тип фиксируется при компиляции, динамики нет.
- Только локальные переменные с инициализатором (и переменные циклов, параметры лямбд)
- Нельзя: поля, параметры методов, возвращаемый тип, без значения,
= null
А ещё Уместен, когда тип очевиден из правой части; вреден, когда скрывает его
Подробно
var появился в Java 10. Компилятор смотрит на выражение справа и подставляет его тип, как если бы вы написали его руками. После этого тип не меняется: var x = 1; x = "a"; не скомпилируется. Это не динамическая типизация, как в JavaScript или Python, — просто меньше шума в коде.
Где работает: локальные переменные с инициализатором, переменные в for и for-each, параметры лямбд (с Java 11, удобно для аннотаций).
Где нельзя: поля класса, параметры методов, возвращаемые значения, объявление без инициализатора, инициализация null, лямбда без целевого типа, массив через {1, 2}.
Тонкость: var list = new ArrayList<>(); выведет ArrayList<Object> — ромбовидный оператор без типа даёт Object. И var выводит конкретный тип справа (ArrayList), а не интерфейс (List).
Рекомендация — использовать, когда тип очевиден: var users = new HashMap<String, List<User>>(). Если справа вызов метода с неочевидным результатом — лучше указать тип явно.
Пример
var users = new HashMap<String, List<User>>(); // тип очевиден
for (var entry : users.entrySet()) { ... }
var x = 10;
// x = "text"; // ошибка: тип x — int
// var y; // ошибка: нет инициализатораЧто хотят услышать
- var — статический вывод типа, а не динамическая типизация.
- Где можно и где нельзя использовать.
- Ловушка с
new ArrayList<>()— плюс. - Когда var улучшает читаемость, а когда ухудшает.
Частые ошибки
- Считать var динамической типизацией.
- Пытаться применить var к полю/параметру.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Это динамическая типизация, как в JavaScript
- ✓Статический вывод типа для локальных переменных с инициализатором
- ✗var можно использовать для полей и параметров методов
- ✗Переменная var может менять тип во время выполнения
Что спросят дальше
- Когда var ухудшает читаемость?
- Можно ли var без инициализатора?
- Что выведет var для литерала 1 и для 1L?
- Почему var нельзя использовать для полей класса?
Разбор темы
- Современный синтаксис: var, текстовые блоки, switch
Локальный вывод типа var, многострочные текстовые блоки, switch-выражения и другие удобства новых версий.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.