Технічно кажучи, у Java є типовий інтерес при використанні дженериків. З загальним методом, як
public <T> T foo(T t) {
return t;
}
Компілятор проаналізує і зрозуміє це, коли ви пишете
// String
foo("bar");
// Integer
foo(new Integer(42));
Строку буде повернуто для першого виклику, а цілий - для другого виклику, виходячи з того, що було введено як аргумент. Ви отримаєте належну перевірку часу компіляції. Крім того, в Java 7 можна отримати деякий додатковий тип посилення при інстанціюванні таких дженериків
Map<String, String> foo = new HashMap<>();
Java досить люб'язна, щоб заповнити для нас порожні кутові дужки. Тепер чому ж не підтримує підтримку типу Java в рамках змінного призначення? В один момент був RFE для перетворення типів у змінних декларацій, але це було закрито, оскільки "Не виправлять", оскільки
Люди отримують вигоду від надмірності декларації типу двома способами. По-перше, резервний тип слугує цінною документацією - читачам не потрібно шукати декларацію getMap (), щоб дізнатися, який тип вона повертає. По-друге, надмірність дозволяє програмісту оголосити призначений тип і тим самим скористатися перехресною перевіркою, виконаною компілятором.
Доповідач, який закрив це, також зазначив, що він просто відчуває себе "не-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
таким чином, дозволяючи програмісту відмовитися від необхідності перезавантажувати тип у виразі лямбда.