Доклад по дженерикам. Java Generics
Скачать 18.19 Kb.
|
Java Generics — это одно из самых значительных изменений в истории языка Java. «Дженерики», доступные с Java 5, сделали использование Java Collection Framework проще, удобнее и безопаснее. Ошибки, связанные с некорректным использованием типов, теперь обнаруживаются на этапе компиляции. Да и сам язык Java стал еще безопаснее. 3 слайд Если не сделать проверку (instanceof) на принадлежность к классу Account, то на втором этапе возможен ClassCastException – то есть аварийное завершение программы. Поэтому такая проверка была обязательной. 5 слайд Ковариантность — это сохранение иерархии наследования исходных типов в производных типах в том же порядке. Контравариантность — это обращение иерархии исходных типов на противоположную в производных типах. Инвариантность — отсутствие наследования между производными типами. 7 слайд Но благодаря wildcard дженерики могут быть инвариантны Это ковариантность. List Это контравариантность. List Запись вида "? extends ..." или "? super ..." — называется wildcard или символом подстановки, с верхней границей (extends) или с нижней границей (super). List extends Number> может содержать объекты, класс которых является Number или наследуется от Number. List super Number> может содержать объекты, класс которых 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 extends Object> , а значит — коллекция может содержать объекты любого класса, так как все классы в Java наследуются от Object – поэтому подстановка называется неограниченной. то, говорят, что ArrayList — это Raw тип параметризованного ArrayList 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. |