С выпуском JDK 10 20 марта Java теперь включает в себя var
имя зарезервированного типа (не ключевое слово - см. Ниже), как указано в JEP 286 . Для локальных переменных в Java 10 или новее действует следующее:
var map = new HashMap<String, Integer>();
Имя зарезервированного типа var
в Java почти идентично ключевому слову var
в C #, поскольку оба допускают неявную типизацию (важные различия см. Ниже). var
в Java может использоваться только для неявного вывода типов в следующих контекстах (как перечислено в JEP 286: Цели ):
- локальные переменные с инициализаторами
- индексы в расширенном цикле for
- местные жители, объявленные в традиционном цикле for
Поэтому var
нельзя использовать для полей, типов возвращаемых данных, имен классов или имен интерфейсов. Его обоснование состоит в том, чтобы исключить необходимость включения длинных имен типов при объявлении и определении локальных переменных, как указано в JEP 286 (автор Brian Goetz):
Мы стремимся улучшить опыт разработчиков за счет сокращения церемонии
связано с написанием кода Java, сохраняя приверженность Java
безопасности статического типа, позволяя разработчикам исключить
часто ненужное объявление манифеста типов локальных переменных.
var
Scoping in Java
Следует отметить, что var
- это не ключевое слово в Java, а зарезервированное имя типа. Как указано в JEP 286:
Идентификатор var не является ключевым словом; вместо этого это зарезервированный тип
название. Это означает, что код, который использует var как переменную, метод или
имя пакета не будет затронуто; код, который использует var как класс или
Это повлияет на имя интерфейса (но на практике эти имена встречаются редко,
поскольку они нарушают обычные правила именования).
Обратите внимание, что поскольку var
является зарезервированным именем типа, а не ключевым словом, его все равно можно использовать для имен пакетов, имен методов и имен переменных (вместе с его новой ролью вмешательства типа). Например, ниже приведены примеры правильного использования var
в Java:
var i = 0;
var var = 1;
for (var i = 0; i < 10; i++) { /* ... */ }
public int var() { return 0; }
package var;
Как указано в JEP 286:
Эта обработка будет ограничена локальными переменными с
инициализаторы, индексы в расширенном цикле for и локальные переменные, объявленные в
традиционный цикл for; это не будет доступно для формальных методов,
формальные конструкторы, типы возвращаемых методов, поля, формальные переменные или
любой другой тип объявления переменных.
Различия между var
в Java и C #
Это одно заметное различие между var
в C # и Java заключается в следующем: var
может использоваться в качестве имени типа в C #, но не может использоваться в качестве имени класса или имени интерфейса в Java. Согласно документации C # (неявно типизированные локальные переменные) :
Если тип с именем var
находится в области видимости, ключевое слово var
будет преобразовано в
это имя типа и не будет рассматриваться как часть неявно типизированного
объявление локальной переменной.
Возможность использовать var
в качестве имени типа в C # создает некоторую сложность и вводит некоторые сложные правила разрешения, которых var
в Java избегает, запрещая var
в качестве имени класса или интерфейса. Для получения информации о сложностях var
имен типов в C # см. Ограничения применяются к объявлениям переменных с неявным типом . Для получения дополнительной информации об обосновании решения о определении объема для `var в Java см. JEP 286: Выбор области действия .