Что означает in Collection?

какой смысл <E> код Collection<E>?

2 ответов


это использование дженериков. Проверьте это интро выход. И тогда не забудьте прочитать это учебник.

следует выдержка (которая сравнивает использование слепка с использованием дженериков):

когда вы видите код , прочитайте его как "типа"; декларация выше читается как "коллекция строк c". В код, использующий дженерики, яснее и более безопасный. Мы устранили небезопасного cast и ряд дополнительных скобки. Что еще более важно, у нас есть перемещенная часть спецификации метод от комментария к его подпись, чтобы компилятор мог проверить во время компиляции, что тип ограничения не нарушаются в время. Потому что программа компилируется без предупреждений, мы можем заявить с уверенность в том, что он не бросит ClassCastException во время выполнения. Этот чистый эффект от использования дженериков, особенно в больших программах, это улучшена читаемость и надежность.

для например, интерфейс списка

public interface List<E> { 
    void add(E x);
    Iterator<E> iterator();
}

это означает, что вы можете создать список, содержимое которого имеет один и тот же явный тип (не только объект типа), даже если вы сами определили тип. Итак, если вы создаете класс Name, вы можете написать

List<Name> nameList = new ArrayList<>();

а затем заполните его экземплярами имен и непосредственно извлеките из него экземпляры имен без необходимости бросать или иным образом беспокоиться об этом, потому что вы всегда получите экземпляр имени или null обратно, никогда экземпляр другого типа.

что еще более важно, вы не можете вставить что-либо отличное от экземпляра Name В такой список, потому что он потерпит неудачу во время компиляции.

nameList.add(false); //Fails!
nameList.add(new Name("John","Smith")); //Succeeds supposing Name has a 
                                        //firstName, lastName constructor

это означает, что вы имеете дело с коллекцией предметов с типа 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?!