Но задумывались ли вы когда-нибудь о дублировании кода при инициализации конкретной реализации коллекций? Почему во время инициализации необходимо записывать параметры два раза?
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 .