Ответ 1
Это использование дженериков. Проверьте ввод. И тогда не забудьте прочитать этот tutorial.
Далее следует выдержка (которая сравнивает использование броска по сравнению с использованием дженериков):
Когда вы увидите код < Тип > , прочитайте его как "Тип"; декларация выше читается как "Collection of String c." код с использованием дженериков более ясен и безопаснее. Мы устранили небезопасные литье и ряд дополнительных круглые скобки. Что еще более важно, мы имеем переместил часть спецификации метод из комментария к его подпись, поэтому компилятор может проверить во время компиляции тип ограничения не нарушаются при запуске время. Поскольку программа компилируется без предупреждений, мы можем указать уверенность в том, что он не ClassCastException во время выполнения. чистый эффект использования дженериков, особенно в крупных программах, является улучшенная читаемость и надежность.
Например, интерфейс списка
public interface List<E> {
void add(E x);
Iterator<E> iterator();
}
Это означает, что вы можете создать список, содержимое которого имеет один и тот же явный тип (не только тип Object), даже если вы сами определили тип. Итак, если вы создаете класс Name, вы можете написать
List<Name> nameList = new List<Name>();
а затем заполнить его экземплярами Name и напрямую получить из него экземпляры имен, не заставляя их бросать или иным образом беспокоиться об этом, потому что вы всегда получите либо экземпляр Name, либо null, а не экземпляр другого типа.
Что еще более важно, вы не можете вставлять что-либо, отличное от экземпляра Name в таком списке, потому что он не сработает во время компиляции.
nameList.add(false); //Fails!
nameList.add(new Name("John","Smith")); //Succeeds supposing Name has a
//firstName, lastName constructor