Главная страница

Доклад по дженерикам. Java Generics


Скачать 18.19 Kb.
НазваниеJava Generics
АнкорДоклад по дженерикам
Дата16.10.2022
Размер18.19 Kb.
Формат файлаdocx
Имя файлаgenerics.docx
ТипДокументы
#736912

Java Generics — это одно из самых значительных изменений в истории языка Java. «Дженерики», доступные с Java 5, сделали использование Java Collection Framework проще, удобнее и безопаснее. Ошибки, связанные с некорректным использованием типов, теперь обнаруживаются на этапе компиляции. Да и сам язык Java стал еще безопаснее.

3 слайд

Если не сделать проверку (instanceof) на принадлежность к классу Account, то на втором этапе возможен ClassCastException – то есть аварийное завершение программы. Поэтому такая проверка была обязательной.

5 слайд

Ковариантность — это сохранение иерархии наследования исходных типов в производных типах в том же порядке.

Контравариантность — это обращение иерархии исходных типов на противоположную в производных типах.

Инвариантность — отсутствие наследования между производными типами.

7 слайд

Но благодаря wildcard дженерики могут быть инвариантны

Это ковариантностьList — подтип List

Это контравариантность. List является подтипом List

Запись вида "? extends ..." или "? super ..." — называется wildcard или символом подстановки, с верхней границей (extends) или с нижней границей (super). List может содержать объекты, класс которых является Number или наследуется от NumberList может содержать объекты, класс которых Number или  у которых Number является наследником (супертип от Number).

8 слайд

Если контейнер объявлен с wildcard ? extends, то можно только читать значения. В список нельзя ничего добавить, кроме null. Для того чтобы добавить объект в список нам нужен другой тип wildcard — ? super

В обратную сторону наоборот

Это называется The Get and Put Principle или PECS (Producer Extends Consumer Super)

10 слайд

На самом деле такой «неограниченный» wildcard все-таки ограничен, сверху. Collection — это тоже символ подстановки, как и "? extends Object". Запись вида Collection равносильна Collection , а значит — коллекция может содержать объекты любого класса, так как все классы в Java наследуются от Object – поэтому подстановка называется неограниченной.

то, говорят, что ArrayList — это Raw тип параметризованного ArrayList. Используя Raw типы, мы возвращаемся в эру до дженериков и сознательно отказываемся от всех фич, присущих параметризованным типам.

11 слайд

присваивание ссылки на Raw тип переменной параметризованного типа, приводит к предупреждению «Unchecked assignment». Если мы проигнорируем его, то возможна ситуация под названием "Heap Pollution" (загрязнение кучи) и ошибкам во время выполнения программы.

Пример 2:

Java разрешает выполнить присваивание в строке (1). Это необходимо для обеспечения обратной совместимости. Но если мы попытаемся выполнить метод add в строке (2), то получим предупреждение Unchecked call — компилятор предупреждает нас о возможной ошибке. В самом деле, мы же пытаемся в список строк добавить целое число.

12 слайд

Когда мы записываем при объявлении класса или метода идентификатор в угловых скобках, например  или , то создаем переменную типа. Переменная типа — это неквалифицированный идентификатор, который можно использовать в качестве типа в теле класса или метода.

15 слайд

Кроме стирания (иногда говорят «затирания») типов, компилятор может добавлять приведение (cast) к нужному типу и создавать переходные bridge-методы, чтобы сохранить полиморфизм в классах-наследниках.

17 слайд

В Java мы говорим, что тип является reifiable, если информация о нем полностью доступна во время выполнения программы. В reifiable типы входят:

Дело в том, что из-за процесса затирания типов компилятором информация о некоторых типах может быть потеряна. Если она потерялась, то такой тип будет уже не reifiable. То есть она во время выполнения недоступна. Если доступна – соответственно, reifiable.

Если информация о типе доступна во время выполнения программы, то такой тип называется Reifiable. К Reifiable типам относятся: примитивные типы, непараметризованные типы, параметризованные типы с неограниченным символом подстановки, Raw типы и массивы, элементы которых являются reifiable.


написать администратору сайта