Но задумывались ли вы когда-нибудь о дублировании кода при инициализации конкретной реализации коллекций? Почему во время инициализации необходимо записывать параметры два раза?
|
1
2
|
List<string> names = new ArrayList<string>();Map<string, Object> objectMap = new HashMap<string, Object>(); |
Что-то вроде этого.
|
1
2
|
List<string> names = new ArrayList();Map<string, object=""> objectMap = new HashMap(); |
Так что нового в JDK 7? Какие преимущества вы получите от новой функции?
Итак, сначала нам нужно понять разницу между необработанным типом и инициализацией универсального типа.
Подобные операторы гарантируют, что реализация будет содержать тот же параметр, который указан во время инициализации.
|
1
|
List<string> names = new ArrayList<string>(); |
В следующем примере компилятор генерирует неконтролируемое предупреждение о преобразовании, поскольку конструктор HashMap() ссылается на необработанный тип HashMap , а не на тип Map<String, List<String>> :
|
1
|
Map<String, List<String>> myMap = new HashMap(); // unchecked conversion warning |
Алмазный Оператор
Хорошо, теперь я представлю новую функцию JDK 7.
Итак, у нас есть что-то под названием оператор Diamond в JDK 7, что уменьшает ваши дополнительные расходы при инициализации.
Синтаксис:
|
1
|
List<string> names = new ArrayList<>(); |
Так что это не только уменьшает ваш код, но и обеспечивает проверку типов.
Вот более четкий пример, объясняющий преимущества вывода типов.
Расширенный пример:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
class Demo {void printStudentNames(List<string> names) {for(String name:names) {System.out.println("String name:"+name);}}public static void main(String[] args) {Demo demo = new Demo();demo.printStudentNames(new ArrayList<>()); // It saved typing here in a method call too.List<string> names = new ArrayList<>();printStudentNames(names);List<string> copyOfNames = new ArrayList<>(names); // It saved typing here in a copy contructor invocation too.}} |
Каковы его ограничения?
Это не будет работать, если вы используете подстановочные знаки.
Что-то вроде этого
|
1
2
3
4
5
6
|
Class Tree<t> {public void demoFunction(List<t> objList) {List<t> copyOfNames = new ArrayList<t>(objList); //This is not gonna work.}} |
В приведенном выше случае аргументы, передаваемые в конструкторе копирования, должны быть Collection <? расширяет T>
Так что он не примет вышеуказанный тип вывода.
Ссылка: зачем нам вывод типа из Java 7? от нашего партнера JCG Саураба Параха в блоге Coding is Cool .