1. Простое понимание дженериков
Универсальные шаблоны — это новая функция Java SE 1.5. Суть дженериков — это параметризованный тип, что означает, что тип данных, с которым выполняется операция, указывается как параметр. Популярным моментом является «переменная типа». Переменные этого типа можно использовать при создании классов, интерфейсов и методов.
Самый простой способ понять дженерики Java — это рассматривать их как удобный синтаксис, который избавляет вас от некоторых операций приведения Java:
Скопируйте код следующим образом: List<Apple> box = new ArrayList<Apple>();box.add(new Apple());Apple apple =box.get(0);
Сам приведенный выше код выражает себя очень ясно: box — это список, содержащий объекты Apple. Метод get возвращает экземпляр объекта Apple, и в этом процессе преобразование типов не требуется. Без дженериков приведенный выше код нужно написать так:
Скопируйте код следующим образом: Apple apple = (Apple)box.get(0);
2. Смущение дженериков
Самым большим преимуществом дженериков является то, что они обеспечивают безопасность типов программ и обратно совместимы, но у них также есть неловкий момент: тип дженерика должен указываться каждый раз, когда он определяется. Это не только кажется немного многословным. чтобы явно указать его, но многие программисты также не знакомы с дженериками, поэтому они часто не могут предоставить правильные параметры типа. Теперь компилятор может автоматически определять типы параметров дженериков, что может уменьшить количество таких ситуаций и улучшить код. читабельность.
3. Улучшения в выводе универсального типа в Java 7.
В предыдущих версиях при использовании универсальных типов необходимо было добавлять универсальный тип с обеих сторон при объявлении и присвоении значений. Например:
Скопируйте код следующим образом: Map<String, String> myMap = new HashMap<String, String>();
Вы можете подумать: я уже указал тип параметра при объявлении переменной, зачем мне указывать его еще раз при инициализации объекта? К счастью, в Java SE 7 этот метод был улучшен, и теперь вы можете объявлять и присваивать значения с помощью следующих операторов:
Скопируйте код следующим образом: Map<String, String> myMap = new HashMap<>() //Обратите внимание на «<>» в конце;
В этом операторе компилятор автоматически выводит универсальный тип при создании экземпляра HashMap на основе универсального типа при объявлении переменной. Опять же, обязательно обратите внимание на «<>» после нового HashMap. Только добавление этого «<>» означает автоматический вывод типа. В противном случае это неуниверсальный тип HashMap, и он будет указан при использовании компилятора. скомпилируйте исходный код. Предупреждение.
Однако: вывод типа в Java SE 7 при создании универсальных экземпляров ограничен: только если параметризованный тип конструктора явно объявлен в контексте, можно использовать вывод типа, в противном случае он не будет работать. Например: следующий пример не может быть правильно скомпилирован в Java 7 (но теперь его можно скомпилировать в Java 8, поскольку тип обобщенного метода автоматически выводится на основе параметров метода):
Скопируйте код кода следующим образом:
List<String> list = новый ArrayList<>();
list.add("A");// Поскольку addAll ожидает параметр типа Collection<? Extends String>, следующий оператор не может пройти
list.addAll(новый ArrayList<>());
4. Улучшения в выводе универсального типа в Java 8.
Существует два основных типа вывода целевого типа для дженериков в Java 8:
1. Поддержка определения общих целевых типов через контекст метода.
2. Поддерживает передачу вывода общего типа последнему методу в цепочке вызовов методов.
Давайте посмотрим на пример с официального сайта:
Скопируйте код кода следующим образом:
Список классов<E> {
статический <Z> List<Z> nil() { ... };
static <Z> List<Z> cons(Z head, List<Z> Tail) { ... };
E голова() { ... }
}
Согласно характеристикам JEP101, мы можем написать так при вызове вышеуказанного метода
Скопируйте код кода следующим образом:
//Автоматически определить тип обобщенного значения через целевой параметр назначения метода
Список<String> l = List.nil();
//Вместо указанного типа отображается
//Список<String> l = List.<String>nil();
//Определить тип универсального метода по типу параметра предыдущего метода
List.cons(42, List.nil());
//Вместо указанного типа отображается
//List.cons(42, List.<Integer>nil());
5. Резюме
Выше приведено содержание функций JEP101. Можно сказать, что Java, являясь представителем статических языков, имеет богатую систему типов. Проблема преобразования типов беспокоит каждого Java-программиста. Автоматическое определение типов с помощью компилятора может немного облегчить проблему слишком сложного преобразования типов. Хотя это небольшое улучшение, оно определенно окажет огромное влияние на наших программистов, которые пишут код каждый день. По крайней мере, они будут чувствовать себя счастливее ~~ Возможно, в Java 9 мы получим универсальный тип var, такой как js или некоторые динамические языки. из скалы они такие^_^