Статьи

Вывод типа из Java 7

Каждый хороший программист любит писать краткий, но эффективный и оптимизированный код. Вывод типа — это способ, введенный в JDK 7, который, несомненно, даст вам преимущества от меньшего количества набрав. Уже давно вы используете Java-код следующим образом.

Но задумывались ли вы когда-нибудь о дублировании кода при инициализации конкретной реализации коллекций? Почему во время инициализации необходимо записывать параметры два раза?

1
2
List<string> names = new ArrayList<string>();
Map<string, Object> objectMap = new HashMap<string, Object>(); 
Теперь большинство из вас будет думать об инициализации как необработанных типах, как вы делали в предыдущей версии JDK.

Что-то вроде этого.

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 .