Какой смысл имеет <E>
код Collection<E>
?
Что означает <E> в коллекции <E>?
Ответ 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
Ответ 2
Это означает, что вы имеете дело с набором элементов с типом E
. Представьте, что у вас есть чашка чая. Вместо чая он может также содержать кофе, поэтому имеет смысл описать чашку как общий объект:
class Cup<T> { … }
теперь вы можете заполнить его либо кофе или чаем (или что-то еще):
Cup<Tea> cuppa = new Cup<Tea>();
Cup<Coffee> foamee = new Cup<Coffee>();
Чтобы это сработало, как Tea
, так и Coffee
должны были быть типы, определенные в вашей программе.
Это ограничение времени компиляции кода. Возвращаясь из примера (скорее бесполезного) чашки, коллекции (массивы, списки...) обычно содержат элементы одного типа, например. целые числа или строки. Дженерики помогут вам выразить это на Java:
Collection<String> strList = new ArrayList<String>();
strList.add("Foobar"); // Works.
strList.add(42); // Compile error!
Обратите внимание на ошибку компиляции выше? Вы получаете это только при использовании дженериков. Следующий код также работает, но не даст хорошего сообщения об ошибке:
Collection strList = new ArrayList();
strList.add("Foobar"); // Works.
strList.add(42); // Works now. Do we really want this?!