В Java 10 была добавлена возможность объявления переменных без явного указания типа, в этом случае компилятор сам выводит тип переменной из выражения инициализации.
При этом используется слово var:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import java.util.Map; import java.text.Collator; import java.util.HashMap; import java.math.BigDecimal; import java.util.Locale; public class Main { public static void main(String [] args) throws Exception { var number = new BigDecimal("100.01"); var myStupidMap = new HashMap<String, Map<Long, BigDecimal>>(); var myCollator = Collator.getInstance(new Locale("ru", "RU")); } } |
Это же Javascript!!@!!@!@@@!!!11111
Нет, это не Javascript. Сами переменные number, myStupidMap и myCollator будут иметь конкретные типы BigDecimal, HashMap и Collator, точно так же, как если бы мы указали их явно.
Мы, например, не можем в переменную number, объявленную и инициализированную таким образом, записать потом ссылку на экземпляр Long:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import java.util.Map; import java.text.Collator; import java.util.HashMap; import java.math.BigDecimal; import java.util.Locale; public class Main { public static void main(String [] args) throws Exception { var number = new BigDecimal("100.01"); number = Long.valueOf(3); // Ошибка компиляции. // Нельзя присвоить переменной // типа BigDecimal значение // типа Long. } } |
Имейте в виду, что при использовании var обязательно должно присутствовать выражение инициализации. Нельзя сначала объявить переменную, а где-то потом присвоить значение:
1 2 3 4 5 6 7 8 9 10 |
import java.math.BigDecimal; public class Main { public static void main(String [] args) throws Exception { // Так не сработает: var v1; // Error: Cannot infer type for local variable v1 v1 = new BigDecimal("101.2"); } } |
А теперь, полный срыв шаблонов. Слово var — это не ключевое слово, а зарезервированное имя типа. Так как var НЕ является зарезервированным словом, то его можно использовать в качестве имени переменной и даже имени метода:
1 2 3 4 5 6 7 8 9 10 11 |
public class Main { public static void main(String [] args) throws Exception { // Магия:) var var = var(); } public static int var() { return 1; } } |
Недостаток var состоит в том, что в последующем он может добавить путаницу в определении типа переменной, так что не стоит слишком сильно увлекаться его использованием.
Когда стоит использовать var:
- локальные переменные,
- переменные, инициализируемые внутри цикла for.
Да, Java уже никогда не будет такой, что была прежде.
А разве нельзя было раньше объявлять
Object number = new BigDecimal(«1»);
Это совершенно другое. В твоём случае переменная number будет иметь тип Object, и ты без приведения типа не сможешь обратиться к методам BigDecimal.