KATA academy Ревью по коллекциям. Конспект дженерики коллукции. Что такое дженерики Какую проблему они решают. Дженерики (обобщения)
Скачать 0.75 Mb.
|
Что такое дженерики? Какую проблему они решают. Дженерики (обобщения) — это особые средства языка Java для реализации обобщённого программирования: особого подхода к описанию данных и алгоритмов, позволяющего работать с различными типами данных без изменения их описания. Одно из назначений — более сильная проверка типов во время компиляции и устранение необходимости явного приведения. Generics позволяют абстрагировать множество типов. Generics — это параметризованные типы. С их помощью можно объявлять классы, интерфейсы и методы, где тип данных указан в виде параметра. В угловых скобках используется <T> — имя параметра типа. Это имя используется в качестве заполнителя, куда будет подставлено имя реального типа, переданного классу MyClass при создании реальных типов. То есть параметр типа T применяется в классе всякий раз, когда требуется параметр типа. Угловые скобки указывают, что параметр может быть обобщен. Сам класс при этом называется обобщенным классом или параметризованным типом. Что такое обобщения в Java? Обобщения - это параметризованные типы. С их помощью можно объявлять классы, интерфейсы и методы, где тип данных указан в виде параметра. Позволяют нам уйти от жесткого определения используемых типов. Какие примитивные типы в Java разрешены при создании дженериков?: Параметром типа для дженерика может быть только ссылочный тип, интерфейс (В этом случае передаваемый на место универсального параметра тип должен реализовать данный интерфейс) или перечисление (enum). Что можно Параметризовать Java? Параметризованные типы позволяют объявлять классы, интерфейсы и методы, (конструкторы) где тип данных, которыми они оперируют, указан в виде параметра. Используя дженерики, можно создать единственный класс, например, который будет автоматически работать с разными типами данных. Что такое стирание типов? Компилятор удаляет из байткода класс-файла информацию о типах-дженериках. Этот процесс и называется стирание типов (type erasure). Он появился в Java 5 вместе с самими дженериками. Такое решение позволило сохранить обратную совместимость без перекомпилляции кода Java 4. Внутри класса-дженерика не хранится информация о его типе параметре. Это и называется стиранием типов. На стадии компиляции происходит приведение объекта класса к типу, который был указан при объявлении. Обобщение реализовано с использованием стирания типов , компилятор стирает всю информацию, относящуюся к типу, во время компиляции, а информация, относящаяся к типу, недоступна во время выполнения. например, List Wildcard Wildcard — это дженерик вида >, что означает, что тип может быть чем угодно. Чтобы наложить ограничение на wildcard необходимо использовать конструкции типа: Запись вида "? extends ..." или "? super ..." — называется wildcard или символом подстановки, с верхней границей (extends - означает, что может быть использован любой класс-наследник) или с нижней границей (super - ). Принцип PECS Для того, чтобы определиться с выбором между extends и super был придуман метод PECS: (Producer Extends Consumer Super.) Если мы объявили wildcard с extends, то это producer. Он только «продюсирует», предоставляет элемент из контейнера, а сам ничего не принимает. Если же мы объявили wildcard с super — то это consumer. Он только принимает, а предоставить ничего не может. Collection> — это тоже символ подстановки, как и "? extends Object". Если необходимо читать из контейнера, то используйте wildcard с верхней границей "? extends". Если необходимо писать в контейнер, то используйте wildcard с нижней границей "? super". Не используйте wildcard, если нужно производить и запись, и чтение. Производитель и потребитель, кто это такие? Очень просто: если метод читает данные из аргумента, то этот аргумент — производитель, а если метод передаёт данные в аргумент, то аргумент является потребителем. Важно заметить, что определяя производителя или потребителя, мы рассматриваем только данные типа T. Не используйте Raw типы! Если аргумент типа не определен, то используйте wildcard >. Raw типы! так называют generic-типы без указания типа-параметра. Такая языковая конструкция валидна, но в большинстве случаев приводит к предупреждению компилятора. «ты не можешь создать массив объектов-дженериков или даже просто типизированный массив.» - Это все — для обеспечения типобезопасности. Дело в том, что дженерики — конструкция времени компиляции, информации о настоящем типе в рантайме нет. Это называется type erasure: Java заменяет везде T на Object в скомпилированном коде (если нет дальнейших условий). При создании массива, однако, Java нуждается в информации о типе элементов, но этот тип недоступен, дженерик не имеет возможности узнать тип своего параметра T! new T[10]; // Ошибка !! List>[] la = new List>[10]; // Ошибка !! Запись вида ArrayList называется raw type (обычный тип). Она эквивалентна записи вида ArrayList Параметризация статических методов. вызов статического метода Class.StaticMethod(). Нужно явно прописывать параметр типа в сигнатуре метода. Если метод статический, то унаследовать параметр типа от класса он не может. Это вызвано тем, что параметр типа привязывается к конкретному объекту при его создании, а статический метод не привязан к конкретному объекту, он привязан к классу в целом. В случае статического метода параметр типа нужно указывать непосредственно перед объявлением метода. public В статическом методе нельзя использовать типы, определенные в классе. Вам этого не позволит компилятор. Что такое коллекция. Иерархия коллекций. Коллекциями/контейнерами в Java принято называть классы, основная цель которых – хранить набор других элементов Методы_интерфейса_Collection'>Методы интерфейса Collection Методы класса ArrayList Реализация интерфейса List с изменяемым размером массива. Методы класса LinkedList Реализация двусвязного списка интерфейсов Listи . Deque Реализует все необязательные операции со списками и разрешает все элементы (включая null). Интерфейс Set Коллекция, не содержащая повторяющихся элементов. Более формально множества не содержат пары элементов e1и e2таких, что e1.equals(e2), и не более одного NULL элемента. Класс HashSet Этот класс реализует интерфейс Set , поддерживаемый хеш-таблицей (фактически экземпляром HashMap ). Он не дает никаких гарантий относительно порядка итерации набора; в частности, это не гарантирует, что порядок останется постоянным с течением времени. Этот класс разрешает NULL элемент. Класс LinkedHashSet Эта реализация отличается от HashSet тем, что поддерживает двусвязный список, проходящий через все его записи. Этот связанный список определяет порядок итерации, то есть порядок, в котором элементы были вставлены в набор ( порядок вставки ). Обратите внимание, что порядок вставки не изменяется, если элемент повторно вставляется в набор. |