Многие разработчики думают, что вывод типов введен в java в выпуске JDK 10 (март 2018 г.), но, поскольку JDK 5, java имеет механизм вывода типов. Вывод локального типа представлен в JDK 10.

Прежде всего, что такое вывод типов?

Под выводом типа понимается автоматическое определение типа данных переменной, которое обычно выполняется во время компиляции.

Пример вывода типа, JDK 5,

Если компилятор не применяет вывод типа, мы должны привести элемент к определенному типу. Как в примере,

List<String> names = new ArrayList<String>();
names.<String>add("Yash");
names.<String>add("Parikh");
System.out.println(names);

Но нам не нужно выполнять приведение из-за вывода типа.

List<String> names = new ArrayList<String>();
names.add("Yash");
names.add("Parikh");
System.out.println(names);

После этого в JDK 7 появился Diamond Operator, в котором параметр типа может быть опущен: вы можете просто предоставить компилятору возможность определять типы из выражения типа. Таким образом, декларацию можно упростить как:

List<String> names = new ArrayList<>();
names.add("Yash");
names.add("Parikh");
System.out.println(names);

В JDK 8 есть лямбда-выражения, которые используют вывод типа.

Пример,

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
list.forEach((Integer e) -> System.out.println(e));
list.forEach(e -> System.out.println(e));

Например, когда мы создаем список целых чисел, мы знаем, что каждый элемент в списке является целым числом. Поэтому, когда мы перебираем весь элемент с помощью внутреннего цикла for-each, нет необходимости явно определять тип, компилятор сам определяет тип. Но если кто-то хочет использовать какое-либо ключевое слово или аннотацию перед этим элементом, тогда мы нужно использовать его тип.

list.forEach((final Integer e) -> System.out.println(e));
list.forEach((final e) -> System.out.println(e));

В JDK 11 представлен альтернативный подход.

После этого до JDK 8 , мы не можем создать анонимный локальный внутренний класс при использовании синтаксиса ромба. Но после JDK 9 мы можем его создать.

Пример,

List<String> names = new ArrayList<>() { 
        // local inner class with diamond syntax
       {
           add("Yash");
           add("Parikh");
       }
  };
System.out.println(names);

В JDK 10 основное использование вывода типа представлено как вывод типа локальной переменной. Для этого вводится контекстно-зависимый идентификатор var.

В Java, когда мы инициализируем переменную, значение должно соответствовать типу этой переменной. Но в этом подходе тип определяется компилятором при компиляции типа.

Пример,

var greet = "yash";
System.out.print(greet);

Тип приветствия будет String. После инициализации мы не можем присвоить этой переменной значение другого типа.

greet = 1;
System.out.print(greet);
//error: incompatible types: int cannot be converted to String
//greet = 1;

Имейте в виду, что var не является ключевым словом.

Пример,

// var is not a keyword
var var = 10;
System.err.println(var);

Другой пример, со списком,

List<String> name = Arrays.asList("yash", "parikh");
for(var string: name){
  System.out.println(string);
 }

Мы не можем использовать этот идентификатор var для объявления переменной экземпляра, типа возвращаемого значения или в качестве типа параметра.

// public void foo(var a){} //ERROR

В JDK 11 мы можем использовать переменную var с лямбда-выражением для использования ключевых слов или аннотаций.

Пример,

list.forEach((final var e) -> System.out.println(e));

Таким образом, это использование вывода типа в JAVA до JDK 11. Он используется во многих других языках программирования, таких как Scala, Swift и т. Д., И C # и C ++ также движутся к нему.