Технически говоря, Java имеет вывод типов при использовании обобщений. С помощью общего метода, такого как
public <T> T foo(T t) {
return t;
}
Компилятор проанализирует и поймет это при написании
// String
foo("bar");
// Integer
foo(new Integer(42));
String будет возвращен для первого вызова и Integer для второго вызова на основе того, что было введено в качестве аргумента. В результате вы получите правильную проверку во время компиляции. Кроме того, в Java 7 можно получить дополнительные выводы при создании экземпляров обобщенных типов, например
Map<String, String> foo = new HashMap<>();
Java достаточно любезен, чтобы заполнить пустые угловые скобки для нас. Теперь, почему Java не поддерживает вывод типов как часть назначения переменных? В какой-то момент был RFE для вывода типа в объявлениях переменных, но это было закрыто как "Не будет исправлено", потому что
Люди извлекают выгоду из избыточности объявления типа двумя способами. Во-первых, избыточный тип служит ценной документацией - читателям не нужно искать объявление getMap (), чтобы выяснить, какой тип он возвращает. Во-вторых, избыточность позволяет программисту объявлять предполагаемый тип и, таким образом, извлекать выгоду из перекрестной проверки, выполняемой компилятором.
Автор, который закрыл это, также отметил, что это просто «не похоже на java», с чем я согласен. Многословие Java может быть и благословением, и проклятием, но оно делает язык таким, какой он есть.
Конечно, этот конкретный RFE не был концом этого разговора. Во время Java 7 эта возможность снова обсуждалась , при этом были созданы некоторые тестовые реализации, в том числе сам Джеймс Гослинг. Опять же, эта функция была в конечном итоге сбита.
С выпуском Java 8 мы теперь получаем вывод типа как часть лямбда-выражений как таковых:
List<String> names = Arrays.asList("Tom", "Dick", "Harry");
Collections.sort(names, (first, second) -> first.compareTo(second));
Компилятор Java , может смотреть на метод , Collections#sort(List<T>, Comparator<? super T>)
а затем интерфейс Comparator#compare(T o1, T o2)
и определить , что first
и second
должно быть , String
таким образом , позволяя программисту отказаться от того , чтобы пересчитать тип в лямбда - выражении.